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

问题描述 投票:0回答:2

我通过向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;
c++ winapi
2个回答
1
投票

WM_ERASEBKGND:当必须删除窗口背景时(例如,调整窗口大小时)发送。邮件发送到准备窗口的无效部分进行绘画。

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


0
投票

您可以使用WM_PAINT在Windows过程中使用FillRect使用Brush填充主窗口。那应该完成您想要的。

case WM_PAINT: {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        FillRect(hdc, &ps.rcPaint, reinterpret_cast<HBRUSH>(COLOR_ACTIVECAPTION + 1));
        EndPaint(hwnd, &ps);
    } return 0;

请参见FillRect函数https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-fillrect

© www.soinside.com 2019 - 2024. All rights reserved.