自定义组件单击消息

时间:2011-03-24 15:44:54

标签: delphi custom-component

我正在编写一个我从速度按钮派生的小组件。我需要做的就是覆盖paint方法,因为我想改变外观。 现在我已经达到了点击按钮时我想要提供不同背景颜色的程度。但是,我找不到在我的组件中捕获鼠标左键单击消息的方法。

到目前为止我用过的东西:

procedure KeyboardButton.WndProc(var Message: TMessage);
begin
  if Message.LParam = VK_LBUTTON then
  begin
    //Some code
  end
  else
    inherited;
end;

当我点击按钮Message.LParam不是1时,这不起作用。

我也试过......

procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

嗯,我知道CM_MOUSELEAVE不是代表鼠标点击的消息。但也许有像CM_MOUSECLICK这样的消息???我找不到它。总之,任何人都可以告诉我什么是CM_XXXX,因为我找不到msdn的任何内容?看起来像Delphi特定的消息。

提前致谢!

3 个答案:

答案 0 :(得分:4)

VCL已经为您跟踪WM_LBUTTONDOWN/UP条消息。在组件的csLButtonDown属性中启用ControlState标志,同时在组件上按住鼠标左键(如果DragMode属性未设置为dmAutomatic,则为)。您的Paint()代码可以检查该标记并根据需要调整其背景图。

答案 1 :(得分:3)

您可以覆盖MouseDown和MouseUp方法。记得检查Button参数的值!

答案 2 :(得分:1)

您没有正确测试鼠标事件。试试这个:

if Message.Msg = WM_LBUTTONDOWN then
  // Some code
else
  inherited;

BTW,TMessage.LParamTMessage.WParam是使用特定消息类型(如WM_LBUTTONDOWN)传递的参数,具有不同的含义,具体取决于TMessage.Msg实际上是什么。应该从不是您获得TMessage等通用消息的情况,只检查WParamLParam