c++ - 如何将 DKGRAY_BRUSH 赋予主窗口区域?

标签 c++ winapi

我通过像这样用 hbrBackground 属性注册窗口类来给背景主窗口颜色:

wcex.hbrBackground  = (HBRUSH)GetStockObject(DKGRAY_BRUSH);

然后:

RegisterClassExW(&wcex);

结果窗口是白色的。当我最小化/最大化窗口时,我有深灰色。 如何立即获得深灰色背景?

谢谢!

编辑:回调函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hgGroupBox1;
    static HWND hsFileSize;
    static HWND hsFileName;
    static HWND hsStatic1;
    static HWND hsStatic2;
    static HWND hsStatic3;
    static HWND hsStatic4;
    static HWND hsFileID;
    static HWND hlbTagV2Frames;

    static HWND hStatus;

    static HBRUSH hbrBkgnd;

    int hauteur, largeur;
    std::wstringstream lbFrames;

    switch (message)
    {
    case WM_CREATE:

        hsStatic1 = CreateWindowEx(0, L"STATIC", L"Fichier :", WS_CHILD | WS_VISIBLE, 5, 5, 60, 20, hWnd, (HMENU)ID_STATIC1, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hsFileName = CreateWindowEx(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE, 65, 5, 800, 20, hWnd, (HMENU)ID_STATICFILENAME, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hgGroupBox1 = CreateWindowEx(0, L"BUTTON", L"TagV2", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 5, 30, 420, hauteur - 100, hWnd, (HMENU)ID_GROUPEBOX1, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hsStatic2 = CreateWindowEx(0, L"STATIC", L"Taille :", WS_CHILD | WS_VISIBLE, 15, 50, 100, 20, hWnd, (HMENU)ID_STATIC2, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hsFileSize = CreateWindowEx(0, L"STATIC", nullptr, WS_CHILD | WS_VISIBLE | WS_BORDER, 15, 75, 100, 20, hWnd, (HMENU) ID_STATICFILESIZE, (HINSTANCE) GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hsStatic3 = CreateWindowEx(0, L"STATIC", L"Entête :", WS_CHILD | WS_VISIBLE, 15, 100, 100, 20, hWnd, (HMENU)ID_STATIC3, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hsFileID = CreateWindowEx(0, L"STATIC", nullptr, WS_CHILD | WS_VISIBLE | WS_BORDER, 15, 125, 200, 20, hWnd, (HMENU)ID_STATICENTETEID, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hsStatic4 = CreateWindowEx(0, L"STATIC", L"Attributs du tagV2 :", WS_CHILD | WS_VISIBLE, 15, 150, 150, 20, hWnd, (HMENU)ID_GROUPEBOX1, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);
        hlbTagV2Frames = CreateWindow(L"LISTBOX", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | LBS_NOTIFY, 15, 175, 400, 200, hWnd, (HMENU)ID_LISTBOXFRAMES, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), nullptr);

        ShowWindow(hsStatic1, SW_SHOW);
        ShowWindow(hgGroupBox1, SW_SHOW);
        ShowWindow(hsStatic2, SW_SHOW);
        ShowWindow(hsFileSize, SW_SHOW);
        ShowWindow(hsStatic3, SW_SHOW);
        ShowWindow(hsFileID, SW_SHOW);
        ShowWindow(hStatus, SW_SHOW);
        ShowWindow(hsStatic4, SW_SHOW);
        ShowWindow(hlbTagV2Frames, SW_SHOW);

        break;

    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Analyse les sélections de menu :
            switch (wmId)
            {
            case IDM_FICHIER_OUVRIR:
               //Here comes the file treatement code.

                }
                break;
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Ajoutez ici le code de dessin qui utilise hdc...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_CTLCOLORSTATIC:
        {
            HDC hdcStatic = (HDC)wParam;
            SetTextColor(hdcStatic, RGB(0, 0, 0));
            SetBkColor(hdcStatic, DKGRAY_BRUSH);
            hbrBkgnd = CreateSolidBrush(DKGRAY_BRUSH);
            return (INT_PTR)hbrBkgnd;
        }
        }
    case WM_CTLCOLORBTN:
        {
            HDC hdcButton = (HDC)wParam;
            SetTextColor(hdcButton, RGB(255, 255, 255));
            SetBkColor(hdcButton, DKGRAY_BRUSH);
        }
        hbrBkgnd = CreateSolidBrush(DKGRAY_BRUSH);
        return (INT_PTR)hbrBkgnd;
    case WM_ERASEBKGND:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;

最佳答案

WM_ERASEBKGND : Sent when the window background must be erased (for example, when a window is resized). The message is sent to prepare an invalidated portion of a window for painting.

最简单的解决方案:删除WM_ERASEBKGND消息或者在WM_ERASEBKGND中添加return DefWindowProc(hWnd, message, wParam, lParam) 消息,如果您不想删除 WM_ERASEBKGND

关于c++ - 如何将 DKGRAY_BRUSH 赋予主窗口区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603928/

相关文章:

c++ - 使用 C++ 中的 opencv 生成的高斯核将图像饱和为白色

Windows .inf 文件 : how do I set the default Network Connection name during network driver install?

c++ - 迭代有序容器与无序容器

c++ - 在 C++11 的一个表达式中对同一个变量进行双重赋值

c++ - 在同一个 C++ 项目中链接两个不同版本的 protobuf 库

performance - 磁盘写入队列长度

c++ - 如何在 "edit"按键上杀死 "Enter"控件的焦点

c++ - 调整网格布局内的标签大小?

c++ - 如何在 VC++ 中将 HICON 转换为 HBITMAP?

c - `MEM_RESERVE` 的 `VirtualAlloc()` 标志今天真的有用吗?