Win32 编辑控件滚动条在 Windows 10 中不起作用

Posted

技术标签:

【中文标题】Win32 编辑控件滚动条在 Windows 10 中不起作用【英文标题】:Win32 Edit control scrollbars not working in Windows 10 【发布时间】:2021-02-05 22:11:03 【问题描述】:

我目前正在尝试在 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, 0, 0, hInst, 0);
    CreateWindow(L"edit", L"placeholder", WS_CHILD | WS_VISIBLE | WS_BORDER
        | WS_HSCROLL | ES_AUTOHSCROLL, 10, 10, 200, 90, hwnd, (HMENU)1, hInst, 0);

    ShowWindow(hwnd, nCmd);
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0) > 0)
    
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    
    return 0;

我还尝试删除 ES_AUTOHSCROLL,因为我读到当设置该样式时滚动条停止工作但没有任何变化(只是您不能再滚动超出控制矩形)

【问题讨论】:

【参考方案1】:

修好了!似乎两个滚动条仅在定义 ES_MULTILINE 时才起作用。

原始文档没有说明任何内容,但情况似乎如此。我通过尝试this example 解决了这个问题,然后删除了一些东西直到它坏了。

【讨论】:

滚动确实在单行左对齐ES_AUTOHSCROLL编辑控件中也起作用,如the docs中所述。 是的,但是滚动条在应用时是一个虚拟的。这就是我想要的

以上是关于Win32 编辑控件滚动条在 Windows 10 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

win32day10-组合框/列表框/滚动条/控件的自绘制

请问:C# listView控件如何判断滚动条的位置?判断滚动条在控件的最下面?

win32应用程序操作控件

win32如何自己编写控件

Win32 中仅接受文本框(编辑控件)中的字符和空格

Creating Dialogbased Win32 Application / 创建基于对话框的Win32应用程序Edit Control的应用Unicode转ANSI自动滚动 /