【问题标题】:custom component click message自定义组件点击消息
【发布时间】:2011-07-22 06:20:08
【问题描述】:

我正在编写一个从速度按钮派生的小组件。我需要做的实际上是重写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 特定的消息。

提前致谢!

【问题讨论】:

    标签: delphi custom-component


    【解决方案1】:

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

    【讨论】:

    • +1 我也一直忘记这一点。我认为这是更正确的答案。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      顺便说一句,TMessage.LParamTMessage.WParam 是使用特定消息类型(如WM_LBUTTONDOWN)传递的参数,并且根据TMessage.Msg 的实际含义而具有不同的含义。 永远不会出现这样的情况:您收到像 TMessage 这样的通用消息,而只检查 WParamLParam

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 1970-01-01
        • 2017-01-28
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        相关资源
        最近更新 更多