如何检测TListView组标题上的鼠标单击?

如何检测TListView组标题上的鼠标单击?,listview,delphi,vcl,delphi-10.1-berlin,Listview,Delphi,Vcl,Delphi 10.1 Berlin,我正在使用Delphi10.1和VCL。如何在TListView中检测到对组标题的单击或双击?不在列标题上。将ListView子类化以捕获与单击相关的消息(WM|LBUTTON(DOWN | UP),WM|lbuttondblck,等等),然后向ListView发送一条消息,指定单击的客户端坐标 根据文档,您必须将消息的wParam设置为-1以获取组信息,这意味着您必须通过直接调用SendMessage()发送LVM\u hitest消息,您不能使用将wParam设置为0的函数 单击组标题时,填

我正在使用Delphi10.1和VCL。如何在
TListView
中检测到对组标题的单击或双击?不在列标题上。

将ListView子类化以捕获与单击相关的消息(
WM|LBUTTON(DOWN | UP)
WM|lbuttondblck
,等等),然后向ListView发送一条消息,指定单击的客户端坐标

根据文档,您必须将消息的
wParam
设置为-1以获取组信息,这意味着您必须通过直接调用
SendMessage()
发送
LVM\u hitest
消息,您不能使用将
wParam
设置为0的函数


单击组标题时,填充的
LVHITTESTINFO
将启用
LVHT\u EX\u Group\u标题
标志,并且
iItem
字段将是组索引。

答案基于Remy和Victoria注释,由Bummi at提供旧答案

对解决方案没有什么评论:

  • 子类是一个选项,但也可以通过表单的ListView1MouseDown事件来实现,这稍微简单一点
  • tLVHitTestInfo和LVM_HITTEST在Winapi.CommCtrl中定义

    Uses
      Winapi.CommCtrl; // For LVM_HITTEST
    
  • LVHT_EX_GROUP_标题值应手动定义。我在德尔福的任何单位里都没有找到。它是单击组标题的标识符。应使用LVHitTestInfo.flags对其进行验证。它对Windows Vista及以上版本有效

    const
      LVHT_EX_GROUP_HEADER = $10000000;
    
  • LVHitTestInfo.iGroup不起作用!我不知道原因。最初,我认为它应该是组索引

  • 该示例有一个带有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;
    
    使用Winapi.CommCtrl;
    程序TForm1.ListView1MouseDown(发送方:ToObject;按钮:TMouseButton;
    移位:t移位状态;X,Y:整数);
    常数
    LVHT_EX_GROUP_标头=$10000000;//它对Windows Vista及以上版本有效。
    变量
    HTI:tLVHitTestInfo;//在Winapi.CommCtrl上定义
    nGroupInx:整数;
    开始
    HTI.pt:=点(X,Y);//添加光标位置
    nGroupInx:=SendMessage(ListView1.Handle,LVM_HITTEST,-1,LPARAM(@HTI));//退货
    如果nGroupInx-1,则//是否找到项?
    如果(HTI.flags和LVHT_EX_GROUP_HEADER)=LVHT_EX_GROUP_HEADER,那么//它是一个组头吗?
    ShowMessage('Clicked Group header:'+''+nGroupInx.ToString);
    结束;
    
    尚未对此进行测试,但您确定列表视图在单击组标题时会收到类似于
    NM\u CLICK
    的通知吗?@Victoria我尚未测试,因此不确定。这就是我提到其他信息的原因,too@Victoria我现在测试了它,实际上,当单击组标题时,不会发出
    NM\u CLICK
    NM\u DBCLK
    ,但会发出
    WM\u LBUTTON(向下|向上)