WinAPI 窗口在绘制后不刷新

winapi window doesn't refresh after painting

本文关键字:刷新 绘制 窗口 WinAPI      更新时间:2023-10-16

嗨,我用这个创建了一个窗口:

WNDCLASSEX WndClass = {0};
if (WndClass.cbSize == 0)
{
    WndClass.cbSize = sizeof(WNDCLASSEX);
    WndClass.style = CS_DBLCLKS;
    WndClass.lpfnWndProc = WindowProcedure;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = GetModuleHandle(NULL);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = HBRUSH(COLOR_WINDOW+1);
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = ClassName.c_str();
    WndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION);
}
if (RegisterClassEx(&WndClass))
{
    WindowHandle = CreateWindowEx(0, ClassName.c_str(), WindowName.c_str(), WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
        CW_USEDEFAULT, CW_USEDEFAULT, Width, Height, NULL, NULL, GetModuleHandle(NULL), NULL);
    if(WindowHandle)
    {
        ShowWindow(WindowHandle, SW_SHOWDEFAULT);
    }
}

并尝试添加一个按钮。使用此:

HWND child = CreateWindowEx(0, L"BUTTON", NULL, WS_CHILD | WS_VISIBLE, n * CHILDS_OFSET, posY, GetWidth(), h, window, NULL, NULL, NULL);

代码执行后,我的窗口保持清晰,但若我移动它或调整它的大小,按钮就会变为可见,这可能是什么问题?

我试过了:

RECT rc;
GetClientRect(window, &rc);
InvalidateRect(window, &rc, TRUE);

如果window是主窗口和按钮的句柄,则已尝试。

如果您的窗口过程没有正确处理WM_PAINT,就会发生这种情况。你必须拥有的最低限度的东西是

...
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        BeginPaint( wnd, &ps );
        EndPaint( wnd, &ps );
        return 0;
    }

我认为您需要在ShowWindow之后调用UpdateWindow,请参阅此处。