问题描述
我目前正在尝试在 Win32 控件中实现一些滚动条,但在设置 WS_HSCROLL 标志时它们不起作用。
从我在其他网站上读到的内容来看,它们“理论上”应该可以工作,因为该类会接收消息并且不会将其推送到父窗口(这也是 Rich 控件的工作方式)。
要添加水平滚动条,请使用样式 WS_HSCROLL;要添加垂直滚动条,请使用样式 WS_VSCROLL。带有滚动条的编辑控件处理它自己的滚动条消息。 Source
但是由于某种原因,滚动的东西不会移动,如果您尝试手动移动它,它只会将方块返回到开始处,而不会进行任何移动。
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR pStr,int nCmd)
{
WNDCLASS wcx = { 0 };
wcx.lpfnWndProc = DefWindowProc;
wcx.hInstance = hInst;
wcx.hCursor = LoadCursor(0,IDC_ARROW);
wcx.hbrBackground = reinterpret_cast<HBrush>(COLOR_BTNFACE + 1);
wcx.lpszClassName = L"SIMPLEWND";
RegisterClass(&wcx);
int desktopwidth = GetSystemMetrics(SM_CXSCREEN);
int desktopheight = GetSystemMetrics(SM_CYSCREEN);
HWND hwnd = CreateWindowEx(0,L"SIMPLEWND",L"Main Window",WS_OVERLAPPEDWINDOW,desktopwidth / 4,desktopheight / 4,desktopwidth / 2,desktopheight / 2,hInst,0);
CreateWindow(L"edit",L"placeholder",WS_CHILD | WS_VISIBLE | WS_BORDER
| WS_HSCROLL | ES_AUTOHSCROLL,10,200,90,hwnd,(HMENU)1,0);
ShowWindow(hwnd,nCmd);
MSG msg;
while (GetMessage(&msg,0) > 0)
{
TranslateMessage(&msg);
dispatchMessage(&msg);
}
return 0;
}
我也试过删除 ES_AUTOHSCROLL 因为我读到当设置该样式时滚动条停止工作但没有任何变化(只是你不能再滚动超过控制矩形)
解决方法
解决了!似乎只有在定义了 ES_MULTILINE 时,两个滚动条才起作用。
原始文档没有对此进行任何说明,但似乎确实如此。我通过尝试 this example 解决了这个问题,然后移除了一些东西直到它坏了。