【发布时间】:2017-04-24 08:47:57
【问题描述】:
编辑:
感谢@immibis,我现在可以使用WM_VSCROLL成功滚动到控件的底部,但我仍然想知道如何检查滚动条是否在底部。
我有一个只读的编辑控件:
HWND hMsgDisplay = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY | WS_VSCROLL, 10, 10, 664, 200, hWnd, (HMENU)IDC_MESSAGE_DISPLAY_EDIT, hInst, NULL);
我想滚动到它的底部。我一直在尝试这个:
SCROLLINFO sb;
ZeroMemory(&sb, sizeof(sb));
sb.cbSize = sizeof(SCROLLBARINFO);
sb.fMask = SIF_ALL;
GetScrollInfo(hMsgDisplay, SB_VERT, &sb);
while (abs(sb.nMax - sb.nPos) > 1) {
SendMessage(hMsgDisplay, EM_SCROLL, SB_LINEDOWN, NULL);
GetScrollInfo(hMsgDisplay, SB_VERT, &sb);
}
当编辑控件中只有一两行文本时它运行良好,但之后程序进入无限循环并卡住。我调试了它,发现即使滚动条是灰色的(它在那里但不能滚动),sb.nMax 仍然给我一个非零数字,无论我发送多少次EM_SCROLL 消息, sb.nPos 仍然为0。如何检测到滚动条已经滚动到底部?
【问题讨论】:
-
MSDN 说发送 EM_SCROLL 等同于发送 WM_VSCROLL,而 WM_VSCROLL 有一个 SB_BOTTOM 选项。您是否尝试过发送一次以立即滚动到底部?
-
或者,使用
SetScrollPos()或SetScrollInfo()(因为您已经知道GetScrollInfo()的最大位置)。 -
感谢@immibis 的建议!我刚试了一下,它奏效了。很抱歉在发布这个问题之前没有先查看它......但即使这个问题已经解决了,我仍然想知道你如何检查滚动条是否在底部。
-
nPage告诉你页面有多大;如果nMax小于页面大小,则它根本无法滚动。