我想在运行时更改按钮的背景颜色。
问题是,按钮没有黑色背景,这是我的代码应该产生的。 相反,看起来它有一个下拉控件的箭头。
我到底错在了什么?
首先我将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);
}
答案 0 :(得分:1)
您没有将按钮ID传递给CreateWindow函数,因此您的按钮没有您认为的ID。
SetBkColor不设置按钮的背景。它为后续调用TextOut设置背景。
您可能打算使用BS_OWNERDRAW,而不是SS_OWNERDRAW。
使用所有者绘制样式时,您必须绘制按钮背景,文本和边框。您可以在WM_DRAWITEM的父窗口处理程序中执行此操作。所以你根本不需要继承子按钮。