gpt4 book ai didi

c# - 用于列标题的 ListView ContextMenuStrip

转载 作者:行者123 更新时间:2023-12-04 02:10:57 30 4
gpt4 key购买 nike

当我右键单击 ListView 列标题时,我显示了一个不同的 ContextMenuStrip,在 ListView 中显示了另一个。

class ListViewExx : ListView
{
public ContextMenuStrip HeaderContextMenu { get; set; }
int contextMenuSet = 0;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
base.WndProc(ref m);
switch(m.Msg)
{
case 0x210: //WM_PARENTNOTIFY
contextMenuSet = 1;
break;
case 0x21: //WM_MOUSEACTIVATE
contextMenuSet++;
break;
case 0x7b: //WM_CONTEXTMENU
if(contextMenuSet == 2 && HeaderContextMenu != null)
HeaderContextMenu.Show(Control.MousePosition);
break;
}
}
}

这很好用。问题是我第一次在 ListView 中右键单击 - 显示标题 contextMenuStrip。

最佳答案

依赖激活状态太hacky了。它要简单得多,WM_CONTEXTMENU 消息传递生成该消息的窗口的句柄。所以你可以简单地将它与 ListView 的句柄进行比较。如果它不匹配,那么你就知道它是标题控件:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x7b) { //WM_CONTEXTMENU
if (m.WParam != this.Handle) HeaderContextMenu.Show(Control.MousePosition);
}
}

从技术上讲,您应该使用 LVM_GETHEADER,但这应该可以正常工作。

关于c# - 用于列标题的 ListView ContextMenuStrip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838494/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com