2011-10-21 11 views

答えて

6

単純なユーザーコントロールListViewOnMouseEnterOnMouseLeave & WndProc

public partial class MyListView : ListView 
{ 
    public MyListView() 
    { 
    } 

    public delegate void ColumnContextMenuHandler(object sender, ColumnHeader columnHeader); 
    public event ColumnContextMenuHandler ColumnContextMenuClicked = null; 

    bool _OnItemsArea = false; 
    protected override void OnMouseEnter(EventArgs e) 
    { 
     base.OnMouseEnter(e); 
     _OnItemsArea = true; 
    } 

    protected override void OnMouseLeave(EventArgs e) 
    { 
     base.OnMouseLeave(e); 
     _OnItemsArea = false; 
    } 

    const int WM_CONTEXTMENU = 0x007B; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_CONTEXTMENU) 
     { 
      if (!_OnItemsArea) 
      { 
       Point p = base.PointToClient(MousePosition); 
       int totalWidth = 0; 
       foreach (ColumnHeader column in base.Columns) 
       { 
        totalWidth += column.Width; 
        if (p.X < totalWidth) 
        { 
         if (ColumnContextMenuClicked != null) ColumnContextMenuClicked(this, column); 
         break; 
        } 
       } 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

および使用

+0

ありがとう、それは動作します。私は20時間以内にポイントを獲得することしかできないと私に伝えています。そうするでしょう。 –

+0

技術的には「UserControl」ではなく、私は... –

+0

@EdS:それはどういう意味ですか?私はそれがリストビューを継承するカスタムコントロールだと思ったのですが? –

0
myListView1.ColumnContextMenuClicked += (sndr, col) => 
{ 
    this.Text = col.Text; 
}; 

をオーバーライドOnMouseEnter /脱退溶液は、ヘッダに時々コンテキストメニューをさえない示します。ここには良い解決策がありますListView ContextMenuStrip for column headers

+0

もう少し詳しく、[このような重複した質問にフラグを立てることができる](https://stackoverflow.com/privileges/comment)。それまでは、回答としてのリンクの投稿は理想的ではなく、一般的に削除されます。または、質問が重複でない場合は、*この特定の質問への回答を調整します*。 –

関連する問題