在Win32中更改子类按钮的背景颜色

时间:2013-07-31 16:58:06

标签: c++ windows button colors subclass

我想在运行时更改按钮的背景颜色。

问题是,按钮没有黑色背景,这是我的代码应该产生的。 相反,看起来它有一个下拉控件的箭头。

我到底错在了什么?

首先我将Button子类化:

// HWND hParent is the parent window
// HINSTANCE hInstance is the current module
HWND h = CreateWindow("Button", NULL, WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 
                      340, 10, 20, 20, 
                      hParent, NULL, hInstance, NULL);

SetWindowSubclass(h, &MyWndProc, MyButtonId, NULL);

ID定义为:

enum
{
    MyButtonId = 100,
};

子类程序:

LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    if( uIdSubclass == MyButtonId )
    {
        switch( msg )
        {
        case WM_ERASEBKGND:
            {
                HDC dc = (HDC)wParam;
                SetBkColor(dc, RGB(127,127,127));
                return 0;
            }
        }
    }
    return DefSubclassProc(hWnd, msg, wParam, lParam);
}

1 个答案:

答案 0 :(得分:1)

您没有将按钮ID传递给CreateWindow函数,因此您的按钮没有您认为的ID。

SetBkColor不设置按钮的背景。它为后续调用TextOut设置背景。

您可能打算使用BS_OWNERDRAW,而不是SS_OWNERDRAW。

使用所有者绘制样式时,您必须绘制按钮背景,文本和边框。您可以在WM_DRAWITEM的父窗口处理程序中执行此操作。所以你根本不需要继承子按钮。