我想在 C++ Builder 中为 TButton 控件着色。我正在尝试遵循我发现的建议使用 SetWindowLong 为我的 TButton 控件启用 BS_OWNERDRAW 样式的信息。然后捕获WM_DRAWITEM消息。虽然我确实看到了该按钮的消息,但从未出现过 WM_DRAWITEM 消息。
我正在使用以下代码:
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
OldButtonWndProc = bTest->WindowProc;
bTest->WindowProc = NewButtonWndProc;
SetWindowLong(bTest->Handle,
GWL_STYLE,
GetWindowLong(bTest->Handle,
GWL_STYLE) | BS_OWNERDRAW);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::NewButtonWndProc(TMessage &AMsg)
{
if (AMsg.Msg == WM_DRAWITEM)
{
Beep();
}
else
{
OldButtonWndProc(AMsg); // default handling.
}
}
//---------------------------------------------------------------------------
我只能假设 BS_OWNERDRAW 标志没有发挥其魔力。我在前后捕获了 GWL_STYLE 以确保设置了 BS_OWNERDRAW 标志。据我所知。我还检查了没有设置其他 BS 标志,但事实并非如此。也许 GWL_STYLE 不是设置此标志的地方?
您应该使用
(Get|Set)WindowLongPtr()
,否则您的代码将无法在 64 位版本中运行。
无论如何,
WM_DRAWITEM
消息都会发送到按钮的父窗口,这就是为什么您在子类中看不到它。 您的子类需要处理 CN_DRAWITEM
消息,父窗口会将其反射回按钮。