C 为什么windows api滚动条没有响应?

C 为什么windows api滚动条没有响应?,c,winapi,scrollbar,C,Winapi,Scrollbar,我试图在窗口中创建一个可滚动的子窗口。子窗口应该有滚动条;滚动条出现,但完全没有响应。窗口创建代码: // "mainwindow" is the handle of the main application window. HWND wnd = CreateWindow(WC_STATIC, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, 10, 100, 300, 300, mainwindow, NULL, GetModuleHandle(0),

我试图在窗口中创建一个可滚动的
子窗口
。子窗口应该有
滚动条
;滚动条出现,但完全没有响应。窗口创建代码:

// "mainwindow" is the handle of the main application window.
HWND wnd = CreateWindow(WC_STATIC, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL,
    10, 100, 300, 300, mainwindow, NULL, GetModuleHandle(0), 0);

SCROLLINFO si = { 0 };
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
si.nMax = 800;

SetScrollInfo(g_wnd, SB_VERT, &si, true);

我已经为新的
子窗口设置了自定义
WNDPROC
,但是没有滚动消息到达。我在互联网上找到了很多例子,但没有一个能在子窗口中使用滚动条。

正如Hans Passant指出的,可滚动的子窗口需要自己的windows类

示例代码:

HWND create_scroll_window(HWND parent)
{
    WNDCLASSEX wcex = { 0 };

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.hInstance = GetModuleHandle(0);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszClassName = TEXT("MyScrollWinClass");

    if (!RegisterClassEx(&wcex)) return 0;

    HWND hWnd = CreateWindow(_T("MyScrollWinClass"), _T(""), WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL, 20, 20,
    300, 300, parent, NULL, wcex.hInstance, NULL);

    return hWnd;
}

可能是因为您的窗口中没有足够的内容需要滚动?没有可滚动内容时,不需要响应(启用)滚动条(也不需要滚动条消息)。我在滚动区域中放置了另一个大小为
800x800
像素的子窗口,但仍然没有运气。我看不到您在这里做了什么,也没有迹象表明您做了什么。如何重现问题?静态控件没有有意义的滚动实现。您必须对其进行子类化以改变其行为。之后,您不太可能实际使用它的任何标准行为。只需创建自己的窗口类就可以了。谢谢@Hans Passant,我现在已经使用自定义的windows类成功创建了可滚动的子窗口。我将添加此作为答案。您可以通过使用
\uu ImageBase
伪链接器变量来改进代码,而不是调用
GetModuleHandle(0)
(请参阅)。这可以确保代码在编译到DLL中时继续工作。“正确答案”可能包括在wndproc中显示
WM_VSCROLL
WM_HSCROLL
处理程序,因为其他发现这个问题的人可能会认为简单地添加一个窗口类就足够了。也许可以链接到Raymond的滚动条系列的条目?(他们是第一批登上博客的人,所以…)