[リストへもどる]
一括表示

投稿時間:2003/04/24(Thu) 11:09
投稿者名:しんじ
Eメール:
URL :
タイトル:
LISTVIEWのColumnHeaderの高さの取得方法
いつもお世話になっております。
LISTVIEWコントロールでダブルクリックでListitemを取得する
ルーチンを作成しているのですが、ColumnHeaderの高さの取得がわかりません。

ListViewの位置は FORM → FRAME2の中に入れていますので
FRAMEのLEFTとTOPが計算に入っています。

下記のコードでも動作はしているのですがダブルクリック時のITEM取得の精度が
今ひとつ良くありません。
(ColumnHeaderの高さがきちんと入っていないのであたりまえですが....)
MSDNでColumnHeaderオブジェクトなども調べましたがHeightプロパティが無く
困っています。

WEBなども検索しましたが、サブクラス化以外に取得方法が載っていませんでした。

制約的に
LISTVIEWはlvwReportで必ず表示しColumnHeaderも必ず表示します。

ですので単純にColumnHeaderの高さえ取得できれば問題ないです。
環境はVB6.0 SP5 +Win2000です。

お手数おかけ致しますがお分かりになる方教えてください。


Private Sub ListView1_DblClick()
    Dim dpoint As POINTAPI
    Dim LItem As ListItem
    
    On Error Resume Next         '--LITEMがNothing時のエラー発生防止
    '--APIの読み出し
    GetCursorPos dpoint
  
  '--構造体に値を格納
    x = dpoint.x - ScaleX(Me.Left + ListView1.Left + Frame2.Left, vbTwips, vbPixels)
    y = dpoint.y - ScaleY(Me.Top + ListView1.Top + Frame2.Top, vbTwips, vbPixels)

  '↓解決したい個所
    y = y - 28        '-- この引いた高さ28が大体のColumnHeaderの高さだと思われる

    Set LItem = ListView1.HitTest(ScaleX(x, vbPixels, vbTwips), _
              ScaleY(y, vbPixels, vbTwips))
    If LItem Is Nothing Then Exit Sub
    If ListView1.View = lvwReport Then
        MsgBox LItem
    End If
End Sub


--BAS1の宣言

    '--POINTAPI構造体の宣言
Type POINTAPI
    x As Long
    y As Long
End Type

    '--GetCursorPosの宣言
Public Declare Function GetCursorPos Lib "user32" _
    (lpPoint As POINTAPI) As Long

投稿時間:2003/04/24(Thu) 11:59
投稿者名:南でたロン
Eメール:
URL :
タイトル:
Re: LISTVIEWのColumnHeaderの高さの取得方法
MouseDown()イベントのX,Y座標を利用すればいいのでは?

どうしてもAPIでやりたいなら、
GetCursorPos()の後に、ScreenToClient()でListViewのクライアント座標
に変換する処理を追加すればいいと思います。

いずれの場合も、ColumnHeaderの高さは必要ありません。

投稿時間:2003/04/24(Thu) 12:01
投稿者名:batchman
Eメール:batchman@ae.wakwak.com
URL :
タイトル:
Re: LISTVIEWのColumnHeaderの高さの取得方法
> いつもお世話になっております。
> LISTVIEWコントロールでダブルクリックでListitemを取得する

お手軽にこんなのでは、駄目でしょうか?

Private lngItemIndex    As Long

Private Sub ListView1_DblClick()

    If lngItemIndex Then
        MsgBox Format$(lngItemIndex)
        lngItemIndex = 0
    End If

End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)

    lngItemIndex = Item.Index

End Sub

投稿時間:2003/04/24(Thu) 14:15
投稿者名:しんじ
Eメール:
URL :
タイトル:
Re^2: LISTVIEWのColumnHeaderの高さの取得方法
皆様ご返答いただきましてありがとうございます。
ScreenToClientを使用すればColumnHeaderの
高さを気にしなくて良いのですね。
勉強になりました。

お二人から頂きました回答を元に検討を行ったのですが、
今回使用するルーチンに関しては絶対にアイコンなどの表示には
なりそうに無いのでbatchmanさんの方法で取得しようと思います。
X座標を特に追跡する必要はなさそうですので...

南でたロンさんから頂きました回答はに関してはクラス化出来そうな
内容ですので今回のルーチンに含めてクラス化したいと思います。

万が一仕様が変わってもクラスを導入することで対応できそうですので(^_^)

本当にありがとうございました。
助かりました!!!!

投稿時間:2003/04/24(Thu) 15:40
投稿者名:batchman
Eメール:batchman@ae.wakwak.com
URL :
タイトル:
Re^3: LISTVIEWのColumnHeaderの高さの取得方法
ごめんなさい....完璧に動作しないソースを提示してしまいました。
アイテムでクリックしてからアイテム以外の作業領域でダブルクリックすると、
ダブルクリック動作になってしまいます。

以下が正しく動作するコードです。

Private lngItemIndex    As Long

Private Sub ListView1_Click()

    If lngItemIndex = -1 Then
        lngItemIndex = ListView1.SelectedItem.Index
    Else
        lngItemIndex = 0
    End If
    
End Sub

Private Sub ListView1_DblClick()

    If lngItemIndex Then MsgBox Format$(lngItemIndex)

End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)

    lngItemIndex = -1

End Sub