如何子类化 TButton?

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

我想在 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 不是设置此标志的地方?

c++ winapi c++builder subclassing tbutton
1个回答
0
投票

您应该使用

(Get|Set)WindowLongPtr()
,否则您的代码将无法在 64 位版本中运行。

无论如何,

WM_DRAWITEM
消息都会发送到按钮的父窗口,这就是为什么您在子类中看不到它。 您的子类需要处理
CN_DRAWITEM
消息,父窗口会将其反射回按钮。

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