- - PR -
Windowsエクスプローラ風のListView
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-02-19 20:25
詳細表示のListViewで、
ヘッダ部分を右クリックしたときに、メニューを表示したいです。 ヘッダ部分の右クリックは何イベントなのでしょうか? どうやらListView自体のマウスイベントには入っていないようなのですが・・・ ちなみに、ヘッダ以外の右クリックでは、 Itemの1件選択時、複数選択時、選択なし時によって個別のメニューを表示しています。 ちょうどWindowsエクスプローラに良く似た処理をしようとしています。 ご教授よろしくお願いします。 | ||||
|
投稿日時: 2007-02-19 22:36
ListView.ColumnClick イベント (msdn2.microsoft.com) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-02-20 09:22
確かに、ColumnClickイベントで左クリックは取得できますが、
右クリックをしたとき、このイベントは発生しないようです。 ・・・私だけでしょうか? | ||||
|
投稿日時: 2007-02-20 10:23
あ、見逃していました。 右クリックは発生しないですね。 System.Windows.Forms.ListView クラスでやるとなると... ListView クラスを継承したコントロールの中で、WM_CONTEXTMENU を拾って、Click した位置を確認し、 ColumnHeader の位置であれば、Event を Raise するという形にしないといけないかもしれませんね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-02-20 11:37
ご回答ありがとうございます。
うーん。少し面倒ですね。 かつてのWindowsプログラミングはほとんどやったことがないので、 少々苦労しましたが、いろんなサイトを参考にして、 それっぽいことができたので載せておきます。 Public Class Class1 Inherits ListView Public Sub New() MyBase.New() View = Windows.Forms.View.Details Columns.Add("aaa") Columns.Add("bbb") End Sub Protected Overrides Sub WndProc(ByRef m As Message) Const WM_CONTEXTMENU As Integer = &H7B MyBase.WndProc(m) Select Case m.Msg Case WM_CONTEXTMENU Dim x As Long = m.LParam.ToInt64 And &HFFFF& Dim y As Long = m.LParam.ToInt64 \ &H10000 And &HFFFF& Dim p As New Point(CInt(x), CInt(y)) p = PointToClient(p) If p.Y < 15 Then MsgBox("ColumnHeader 右クリック!") End If End Select End Sub End Class | ||||
|
投稿日時: 2007-02-20 13:44
MsgBox には RaiseEvent もしくは OnColumnHeaderClick のようなメソッドが入るとして... 15 というマジック ナンバーは流石にまずいでしょう。 画面のプロパティ、もしくはフォントの大きさが変更されたら破綻してしまいますよ。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-02-20 14:39
すみません。
ColumnHeaderの高さを取得する方法がわかりませんでした。 わかりましたら教えていただけませんか? | ||||
|
投稿日時: 2007-02-20 15:12
こんにちは。
リストビューコントロール内のヘッダーコントロールを取得し、 LVM_GETHEADER ヘッダーコントロールの矩形を取得する GetClientRect という感じでしょうか。 |