5

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

非常感谢,克里斯托弗

4

2 回答 2

0

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

以下是MSDN 截取的示例代码 - 使用滚动条。例如,xCurrentScroll 是通过调用 GetScrollPos() 来确定的。

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);
于 2011-01-17T12:03:20.543 回答
0

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

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

滚动呼叫功能:

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