绘画后winapi窗口不刷新

Posted

技术标签:

【中文标题】绘画后winapi窗口不刷新【英文标题】:winapi window doesn't refresh after painting 【发布时间】:2013-08-30 12:07:51 【问题描述】:

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

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 是否是主窗口和按钮的句柄。

【问题讨论】:

您的 WindowProcedure 中有什么?如果您没有正确处理WM_PAINT,可能会发生这种情况。 @jlahd 可能这里是错误的,我是 WinAPI GUI 的新手,所以找到了一个没有WM_PAINT 处理的示例,只有break,应该如何处理? @user2623967 我强烈建议您阅读这里的分步教程:winprog.org/tutorial 使用 string::c_str() 生成必须在应用程序的生命周期内保持稳定的 C 字符串是你有一天会后悔的做法。 @Hans 我不明白为什么当RegisterClassExCreateWindowEx 返回后,这两个std::strings 需要稳定甚至还活着。 【参考方案1】:

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

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

【讨论】:

完美,工作正常。它应该包含在 WinAPI GUI 的所有初学者教程中。 是的,有数百个 WinAPI GUI 教程,通常带有示例应用程序,您只是不够努力寻找它们。这是一个涵盖一些几乎没有人再使用的遗留主题的网站。 functionx.com/win32【参考方案2】:

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

【讨论】:

以上是关于绘画后winapi窗口不刷新的主要内容,如果未能解决你的问题,请参考以下文章

WINAPI 窗口不工作。 [关闭]

如何使用winapi实现类似Steam的窗口?

未创建对话框 WinAPI

C#。 WinApi。在窗口上绘制

移动窗口时 C++/WinApi 内存使用率上升

使用 gdi 在 winapi 窗口中的运行时更新颜色