列标题的ListView ContextMenuStrip

时间:2013-07-24 15:28:50

标签: c# winforms listview

当我右键单击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。

2 个答案:

答案 0 :(得分:4)

依赖激活状态实在太过分了。它更简单,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,但这应该可以正常工作。

答案 1 :(得分:1)

我尝试找到一种干净的方法来获取Column Header Rectangle的{​​{1}},以检查用户右键点击的点是否在ListView。但是,我刚刚发现Column Header的{​​{1}}似乎仅在Column Header Rectangle事件处理程序中显示。这个解决方案是我能想到的所有帮助你的解决方案:

ListView