0

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

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

我在这里到底做错了什么?

首先,我将 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);
}
4

1 回答 1

1

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

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

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

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

于 2013-07-31T18:09:48.357 回答