我右键单击 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;
}
}
}
这个很好用。问题是,我第一次在列表视图中右键单击时,标题的上下文菜单会显示。
WM_PARENTNOTIFY
和其他消息,看起来WM_PARENTNOTIFY
被发送到了你的ListView
,然后是WM_MOUSEACTIVATE
,这使得你的contextMenuSet=2
。你应该确保这些消息在你想要的时候被发送,我认为这种解决方案不可靠,除非你彻底理解WM_PARENTNOTIFY
和WM_MOUSEACTIVATE
在哪些情况下会被发送到你的ListView
。 - King King