Winapi 设置按钮背景颜色问题

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

我在更改 winapi 应用程序中按钮的颜色时遇到问题。这是我的 winproc:

LRESULT CALLBACK WndProc(
    HWND hWnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
)
{
    HWND A = NULL;
    switch (message) {
    case WM_CREATE:
        A = CreateWindow(
            L"BUTTON",
            L"A",      // Button text 
            WS_TABSTOP | WS_VISIBLE | WS_CHILD,
            0,
            0,
            (maxX) / 2,
            (maxY) / 2,
            hWnd,
            NULL,
            (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE),
            NULL
        );
        break;
    case WM_DESTROY:
        DestroyWindow(hWnd);
        break;
    case WM_CTLCOLORBTN:
        SetBkColor(GetDC(A), RGB(255, 0, 0));
        return (INT_PTR)CreateSolidBrush(RGB(255, 0, 0));
        break;
    default:
        return DefWindowProc(
            hWnd,
            message,
            wParam,
            lParam
        );
    }
    return 0;
}

我创建了按钮,效果很好,当我在调试模式下测试它时,它会显示在应用程序上。问题是它似乎不想改变颜色。

我在文档中看到它说:

默认情况下,DefWindowProc 函数选择按钮的默认系统颜色。具有

BS_PUSHBUTTON
BS_DEFPUSHBUTTON
BS_PUSHLIKE
样式的按钮不使用返回的画笔。具有这些样式的按钮始终使用默认的系统颜色绘制。绘制按钮需要几种不同的画笔(面、高光和阴影),但 WM_CTLCOLORBTN 消息只允许返回一种画笔。要为按钮提供自定义外观,请使用所有者绘制的按钮。有关更多信息,请参阅创建所有者绘制的控件。

所以我从按钮上删除了

BS_DEFPUSHBUTTON
,但它仍然不起作用。

有人可以帮我把按钮改成不同的颜色吗?

winapi
1个回答
0
投票

尝试将

BS_OWNERDRAW
添加到
WS_SYTLE
。 但如果创建的按钮使用视觉样式,则不会发送
WM_CTLCOLORBTN
。所以我认为不会有好的改变。

我建议你使用自定义绘图

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