Win32滚动示例

时间:2010-05-02 17:17:31

标签: winapi scroll win32gui

有没有人能指出(或提供?)一些很好的,明确的如何在Win32中实现滚动的例子?显然,谷歌提出了很多东西,但大多数例子对我来说似乎太简单或太复杂,无法确保他们展示出正确的做事方式。我在当前项目中使用LispWorks CAPI(跨平台Common Lisp GUI库),在Windows上我有一个难以弄清楚的与滚动相关的错误;基本上我想直接通过Win32 API进行一些测试,看看我是否可以对这种情况有所了解。

非常感谢, 克里斯托弗

2 个答案:

答案 0 :(得分:1)

我认为你正在谈论如何处理WM_VSCROLL / WM_HSCROLL事件的例子。如果是这样,第一步是处理该事件。您不应该使用该调用的HIWORD(wParam)值,而是使用GetScrollInfo,GetScrollPos和GetScrollRange函数。

以下是MSDN - Using Scroll Bars剪切的示例代码。之前通过调用GetScrollPos()来确定xCurrentScroll。

int xDelta;     // xDelta = new_pos - current_pos  
int xNewPos;    // new position 
int yDelta = 0; 

switch (LOWORD(wParam)) { 
    // User clicked the scroll bar shaft left of the scroll box. 
    case SB_PAGEUP: 
        xNewPos = xCurrentScroll - 50; 
        break; 

    // User clicked the scroll bar shaft right of the scroll box. 
    case SB_PAGEDOWN: 
        xNewPos = xCurrentScroll + 50; 
        break; 

    // User clicked the left arrow. 
    case SB_LINEUP: 
        xNewPos = xCurrentScroll - 5; 
        break; 

    // User clicked the right arrow. 
    case SB_LINEDOWN: 
        xNewPos = xCurrentScroll + 5; 
        break; 

    // User dragged the scroll box. 
    case SB_THUMBPOSITION: 
        xNewPos = HIWORD(wParam); 
        break; 

    default: 
        xNewPos = xCurrentScroll; 
} 

[...]

// New position must be between 0 and the screen width. 
xNewPos = max(0, xNewPos); 
xNewPos = min(xMaxScroll, xNewPos); 

[...]

// Reset the scroll bar. 
si.cbSize = sizeof(si); 
si.fMask  = SIF_POS; 
si.nPos   = xCurrentScroll; 
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);

答案 1 :(得分:0)

这是一个,ScrollCall,(从页面复制):。

<块引用>

ScrollCall 是一个演示程序,它采用 Windows 标准的示例 控件,连同标准 GDI 图像,并将它们排列在一个 设备上下文(或 DC),在一个窗口中。视尺寸而定 图像,以及包含窗口的大小,水平和/或 系统滚动条变得可见,以启用图像滚动 和控制。因此 ScrollCall 至少同样专注于调整大小 因为它是滚动的,两者都为用户提供了独特的挑战 程序员。

ScrollCall 功能:

  • 系统滚动条
  • 可选分组框
  • 用于在设备上下文 (DC) 上打开图像的按钮
  • 用于选择窗口滚动功能的无线电选项
  • 复选框以拉伸而不是滚动图像
  • 使用 UpDown 和 Buddy 标记 Paint Mult 以增加 WM_SIZE 在调整大小期间的等待时间,从而减少 WM_PAINT 处理
  • 右键单击默认视图或连接到桌面的显示器的系统快照
  • 双击以将(大部分为空)客户端窗口的可见部分打印到 DC,然后返回到客户端窗口(实验性)
  • ScrollCall 临时打开 SPI_SETDRAGFULLWINDOWS 以测试拖动的视觉效果(如果它被关闭)
  • 与 AeroSnap 尺寸的兼容性