- PR -

Windowsエクスプローラ風のListView

投稿者投稿内容
Yun
常連さん
会議室デビュー日: 2007/01/25
投稿数: 22
投稿日時: 2007-02-19 20:25
詳細表示のListViewで、
ヘッダ部分を右クリックしたときに、メニューを表示したいです。
ヘッダ部分の右クリックは何イベントなのでしょうか?
どうやらListView自体のマウスイベントには入っていないようなのですが・・・

ちなみに、ヘッダ以外の右クリックでは、
Itemの1件選択時、複数選択時、選択なし時によって個別のメニューを表示しています。

ちょうどWindowsエクスプローラに良く似た処理をしようとしています。

ご教授よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-19 22:36
引用:

Yunさんの書き込み (2007-02-19 20:25) より:

どうやらListView自体のマウスイベントには入っていないようなのですが・・・


ListView.ColumnClick イベント (msdn2.microsoft.com)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Yun
常連さん
会議室デビュー日: 2007/01/25
投稿数: 22
投稿日時: 2007-02-20 09:22
確かに、ColumnClickイベントで左クリックは取得できますが、
右クリックをしたとき、このイベントは発生しないようです。
・・・私だけでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-20 10:23
引用:

Yunさんの書き込み (2007-02-20 09:22) より:

確かに、ColumnClickイベントで左クリックは取得できますが、
右クリックをしたとき、このイベントは発生しないようです。


あ、見逃していました。
右クリックは発生しないですね。

System.Windows.Forms.ListView クラスでやるとなると...
ListView クラスを継承したコントロールの中で、WM_CONTEXTMENU を拾って、Click した位置を確認し、
ColumnHeader の位置であれば、Event を Raise するという形にしないといけないかもしれませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Yun
常連さん
会議室デビュー日: 2007/01/25
投稿数: 22
投稿日時: 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
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-20 13:44
引用:

Yunさんの書き込み (2007-02-20 11:37) より:

If p.Y < 15 Then
MsgBox("ColumnHeader 右クリック!")
End If


MsgBox には RaiseEvent もしくは OnColumnHeaderClick のようなメソッドが入るとして...

15 というマジック ナンバーは流石にまずいでしょう。
画面のプロパティ、もしくはフォントの大きさが変更されたら破綻してしまいますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Yun
常連さん
会議室デビュー日: 2007/01/25
投稿数: 22
投稿日時: 2007-02-20 14:39
すみません。
ColumnHeaderの高さを取得する方法がわかりませんでした。
わかりましたら教えていただけませんか?
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-02-20 15:12
こんにちは。

引用:

Yunさんの書き込み (2007-02-20 14:39) より:
すみません。
ColumnHeaderの高さを取得する方法がわかりませんでした。
わかりましたら教えていただけませんか?



リストビューコントロール内のヘッダーコントロールを取得し、
LVM_GETHEADER

ヘッダーコントロールの矩形を取得する
GetClientRect

という感じでしょうか。

スキルアップ/キャリアアップ(JOB@IT)