2017-01-23 23 views
0

多くの値といくつかのグループが含まれている私のWinFormsアプリケーションではListViewを使用します。グループヘッダーにはグループの名前しか表示されないので、グループのヘッダーに「Show description」という項目を追加して、グループの長い要約を表示します。ListView Group Header Click - ListView Group Headersにコンテキストメニューを追加する方法?

私はたった今この機能を持つサードパーティのコントロールを見つけました。

サードパーティのソフトウェアを使用せずにグループヘッダーにContextMenuを追加するにはどうすればよいですか?

答えて

3

LVM_HITTESTメッセージをListViewに送信できます。 -1wParamに渡すと、戻り値が-1より大きく、結果にLVHT_EX_GROUP_HEADERが設定されている場合は、SendMessageメソッドの戻り値がグループインデックスをクリックされます。以下の実装では

実装

、私はMyListViewクラスにGroupHeaderClickイベントを追加しました。あなたは、単にイベントをこのように扱うことができます。

ここ
private void myListView1_GroupHeaderClick(object sender, int e) 
{ 
    //Show ContextMenuStrip here. Or just for example: 
    MessageBox.Show(myListView1.Groups[e].Header); 
} 

MyListView実装です:

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
public class MyListView : ListView 
{ 
    public event EventHandler<int> GroupHeaderClick; 
    protected virtual void OnGroupHeaderClick(int e) 
    { 
     var handler = GroupHeaderClick; 
     if (handler != null) handler(this, e); 
    } 
    private const int LVM_HITTEST = 0x1000 + 18; 
    private const int LVHT_EX_GROUP_HEADER = 0x10000000; 
    [StructLayout(LayoutKind.Sequential)] 
    private struct LVHITTESTINFO 
    { 
     public int pt_x; 
     public int pt_y; 
     public int flags; 
     public int iItem; 
     public int iSubItem; 
     public int iGroup; 
    } 
    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] 
    private static extern int SendMessage(IntPtr hWnd, int msg, 
     int wParam, ref LVHITTESTINFO ht); 
    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     base.OnMouseDown(e); 
     var ht = new LVHITTESTINFO() { pt_x = e.X, pt_y = e.Y }; 
     var value = SendMessage(this.Handle, LVM_HITTEST, -1, ref ht); 
     if (value != -1 && (ht.flags & LVHT_EX_GROUP_HEADER) != 0) 
      OnGroupHeaderClick(value); 
    } 
} 
+0

あなたのコード(特にれるonmousedown方法)をコメントしてくださいもらえますか?私は完全に理解していないコードをコピー&ペーストしたくない – Paedow

+0

実際に 'OnMouseDown'には' [LVM_HITTEST'](https://msdn.microsoft.com/en-us/library/windows/desktop/bb761099%)を送るべきです28v = vs.85%29.aspx?f = 255&MSPPError = -2147217396)メッセージを 'ListView'に送ります。次に、結果が-1より大きく、['LVHITTESTINFO'](https://msdn.microsoft.com/en-us/library/windows/desktop/bb774754(v = vs.85).aspx ) 'SendMessage'に渡したものは' LVHT_EX_GROUP_HEADER'フラグを含み、結果はクリックされたヘッダグループのインデックスであることを意味します。コードの残りは宣言と[イベントの発生]です(https://msdn.microsoft.com/en-us/library/9aackb16(v = vs.110).aspx)。 –

+0

['LVM_HITTEST'](https://msdn.microsoft.com/en-us/library/windows/desktop/bb761099%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)のリンクを追加しました。パラメータと戻り値のセクションを参照してください:) –

関連する問題