谁能指出(或提供?)一些关于如何在 Win32 中实现滚动的好、清晰的例子?很明显,谷歌提供了很多东西,但大多数例子要么太简单,要么太复杂,以至于我无法确定它们展示了正确的做事方式。我在当前项目中使用 LispWorks CAPI(跨平台 Common Lisp GUI 库),在 Windows 上,我有一个与滚动相关的难以解决的错误;基本上我想直接通过 Win32 API 做一些测试,看看我是否可以对这种情况有所了解。
非常感谢,克里斯托弗
我认为您正在谈论如何处理 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);
这是一个,ScrollCall,(从页面复制):。
ScrollCall 是一个演示程序,它采用 Windows 标准控件的样本以及标准 GDI 图像,并将它们排列在窗口中的设备上下文(或 DC)上。根据图像的尺寸和包含窗口的大小,水平和/或系统滚动条变得可见,以启用图像和控件的滚动。因此,ScrollCall 至少与滚动一样关注大小,两者都为程序员提供了独特的挑战。
滚动呼叫功能: