【问题标题】:How to detect a mouse click on a TListView Group header?如何检测鼠标单击 TListView 组标题?
【发布时间】:2018-04-21 10:57:50
【问题描述】:

我正在使用 Delphi 10.1 和 VCL。如何检测单击或双击 TListView 中的组标题?不在列标题上。

【问题讨论】:

    标签: listview delphi vcl delphi-10.1-berlin


    【解决方案1】:

    子类化 ListView 以捕获与点击相关的消息(WM_LBUTTON(DOWN|UP)WM_LBUTTONDBLCLK 等),然后向 ListView 发送 LVM_HITTEST 消息,指定点击的客户端坐标。

    根据文档,您必须将消息的wParam 设置为-1 才能获取组信息,这意味着您必须通过直接调用SendMessage() 来发送LVM_HITTEST 消息,您不能使用@987654322 @函数,将wParam设置为0。

    单击组标题时,填充的LVHITTESTINFO 将启用LVHT_EX_GROUP_HEADER 标志,iItem 字段将是组索引。

    【讨论】:

    • 尚未对此进行测试,但您确定列表视图会在单击组标题时收到NM_CLICK 之类的通知吗?
    • @Victoria 我还没有测试过,所以不,我不确定。这也是我提到其他消息的原因
    • @Victoria 我现在测试了一下,确实NM_CLICKNM_DBCLK在点击组头时不会发出,但是WM_LBUTTON(DOWN|UP)
    【解决方案2】:

    答案基于 Remy 和 Victoria cmets,Bummi 的旧答案https://www.entwickler-ecke.de/topic_ListViewEigenschaften+Delphi+vs+C+SubItems+auslesen_110307,0.html

    几个 cmets 的解决方案:

    1. Subclass 是一个选项,但也可以通过 Form 的 ListView1MouseDown 事件来实现,这有点简单。
    2. tLVHitTestInfo & LVM_HITTEST 在 Winapi.CommCtrl 中定义。

      Uses
        Winapi.CommCtrl; // For LVM_HITTEST
      
    3. LVHT_EX_GROUP_HEADER 值应手动定义。我没有在任何 Delphi 单元中找到它。它是单击组标题的标识符。应该使用 LVHitTestInfo.flags 对其进行验证。适用于 Windows Vista 及以上版本。

      const
        LVHT_EX_GROUP_HEADER = $10000000;
      
    4. LVHitTestInfo.iGroup 不起作用!我不知道原因。本来我以为应该是Group索引。

    示例中有一个带有ListView的表单,样式为ViewStyle = vsReport。在组头上单击鼠标将调用带有组索引的消息对话框。详细代码如下:

        Uses Winapi.CommCtrl;
    
        procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        const
          LVHT_EX_GROUP_HEADER = $10000000; // It is Valid for Windows Vista and above.
        var
          HTI: tLVHitTestInfo; // Defined on Winapi.CommCtrl
          nGroupInx: integer;
        begin
          HTI.pt     := point(X, Y); // Add cursor position
          nGroupInx  := SendMessage(ListView1.Handle, LVM_HITTEST, -1, LPARAM(@HTI)); // Return an Item
          if nGroupInx <> -1 then // Is an Item found?
            if (HTI.flags and LVHT_EX_GROUP_HEADER) = LVHT_EX_GROUP_HEADER then // Is it a Group Header?
                ShowMessage('Clicked Group header:' + ' ' + nGroupInx.ToString);
        end;
    

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多