【问题标题】:Win32 window not redrawing when controls are updated更新控件时 Win32 窗口不重绘
【发布时间】:2020-11-13 19:38:15
【问题描述】:

我是win32编程的新手,所以我提前道歉。我有一个窗口,其中包含 2 个似乎相关的问题。

  1. 如果我调整一个窗口的大小,它会留下一部分背景黑色,或者如果我最小化它会留下全部背景。
  2. 我有一个SysLink,单击它时会调用ShowWindow 来隐藏自身并显示隐藏的组合框控件。组合框会显示,但链接不会隐藏。它无法访问,但仍然可见。

以下是完整的测试代码。

#include <Windows.h>
#include <commctrl.h>

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND link;
HWND combo;

int WINAPI wWinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance, 
                    PWSTR pCmdLine,
                    int CmdShow)
{
    WNDCLASSW wc = {0};
    wc.lpszClassName = L"MainWindow";
    wc.hInstance     = hInstance;
    wc.lpfnWndProc   = WndProc;
    wc.hCursor       = LoadCursor(0, IDC_ARROW);

    RegisterClassW(&wc);
    CreateWindowW(wc.lpszClassName, L"Test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                  0, 0, 340, 280,
                  nullptr, nullptr, hInstance, nullptr);
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
} // end wWinMain

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_CREATE:
            link = CreateWindowExW(0, L"SysLink", L"<a>Add filter</a>",
                                   WS_CHILD | WS_VISIBLE,
                                   20, 20, 100, 28, hwnd, nullptr, nullptr, nullptr);
            combo = CreateWindowExW(0, L"COMBOBOX", nullptr,
                                    WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
                                    50, 20, 140, 28, hwnd, nullptr, nullptr, nullptr);
            ShowWindow(combo, SW_HIDE);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        case WM_NOTIFY:
            switch (((LPNMHDR)lParam)->code)
            {
                case NM_CLICK:
                case NM_RETURN:
                    if (((LPNMHDR)lParam)->hwndFrom == link)
                    {
                        ShowWindow(link, SW_HIDE);
                        ShowWindow(combo, SW_SHOW);
                    }
                    break;
            }
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    窗口类是在没有背景画笔的情况下注册的。要解决这个问题以及随之而来的重绘,请在RegisterClassW 之前添加(例如)以下内容。

        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    

    【讨论】:

    • @PaulSanders 感谢您了解该问题,现已修复。作为参考,+1 记录在 here
    • 谢谢你,我对这个修复如此简单感到非常沮丧。我一定错过了我正在使用的演示中的那一行
    • @steveo225 现在你下次看到它就知道了。问题是在 C WinAPI 级别工作并不太宽容。
    • 哦,相信我,我已经知道了。我不得不强迫自己做的事情的数量已经很疯狂了。我试图将我的 SO 问题限制在我被困多天的问题上。我通常使用 Qt 或一些图形工具包,但想要尝试原生 GUI 编程。这很难,但它使用的内存要少得多,而且通常响应速度更快。赢得一些,失去一些
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多