2006-06-11(Sun)

リストビュー第3回 リストビューのアイテムを取得してみる

小休止 7 8 回

第3回 リストビューのアイテムを取得してみる

メニューから先頭のレコード内容を表示する処理を追加してみる。
第1回第2回 の続きだふ。

1)メニューを設定する
プロジェクトエディタのマテリアルから「Menu」を右クリックし「メニューを挿入」をクリック。


メニューID は MainMenu とでもして、次のように定義した。
(「実験」はポップアップ、「アイテム取得」の ID は IDM_GetItem にしてある。)


次に、MainWnd の RAD ツール右の「メニュー」を、今ほど作成した MainMenu に設定。
メインウィンドウを右クリックして「メニューによるイベント」をクリックする。

すると、定義したメニューの一覧が出るので「アイテム取得」をダブルクリックし、コーディングを行う。


2)アイテムを取得する
今回はとりあえず一番上のレコードに格納されているアイテムを取得してみる。
本当に取得できたか、最後に内容をメッセージボックスで表示する。

/*メニュー:アイテム取得*/
Sub MainWnd_IDM_GetItem_MenuClick()
    Dim lvi As LVITEM           'リストビューアイテムの構造体
    Dim buf[256] As Byte        'アイテム格納用
    Dim buf2 As String
    Dim i As Long
    'アイテム取得
    lvi.mask = LVIF_TEXT
    lvi.iItem = 0                   'インデックス(縦)
    lvi.pszText = VarPtr(buf[0])    '格納するバッファのポインタ
    lvi.cchTextMax = 256            '格納するサイズ(Byte)
    For i = 0 to 1
        lvi.iSubItem = i            'サブアイテム(横)
        SendMessage( hList, LVM_GETITEM, 0, VarPtr(lvi) As Long )   'アイテム取得
        buf2 = buf2 + MakeStr( buf As *Byte ) + " "
    Next
    '表示
    MessageBox( hMainWnd, buf2, "アイテム取得テスト", MB_OK )
End Sub


前回、アイテムの格納で SETLVITEM というメッセージを送ったが、今回は取得なので GETLVITEM を送る。
そのまんまの名前でうれしく思います、大統領。

前回同様、.iItem にレコードのインデックス番号(縦方向)、.iSubItem にサブアイテム(横方向)を指定。
リストビューに GETLVITEM を送ると、.pszText に指定したアドレスへアイテムの内容が入るので、buf のアドレスを指定しておけば格納される。

次のサブアイテムを取得するためには、.iSubItem の値を変える。
今回は ForNext で回してみた。

でもって実行すると次のようになる。

無事取得でけた。

以降、ここまでの MainWnd.sbp 全ソースコード
<ここまでの MainWnd.sbp 全ソースコード>
色の違う場所が今回追加された部分


'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。

Dim hList As HWND   'リストビューのハンドル代入用グローバル変数

'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数


Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
    ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

    ' イベントプロシージャの呼び出しを行います。

    MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。


Sub MainWnd_Destroy()
    LV_SAMPLE_DestroyObjects()
    PostQuitMessage(0)
End Sub

/*ウィンドウ作成時*/
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    'リストビュー初期設定
    hList = GetDlgItem( hMainWnd, ListView1 )    'リストビューのハンドルを取得
    SendMessage( hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
            LVS_EX_GRIDLINES or LVS_EX_FULLROWSELECT or LVS_EX_FLATSB )   'スタイル設定

    'カラム初期設定
    Dim clm As LVCOLUMN 'リストビューカラム構造体
    Dim i As Long
    Dim buf As String
    clm.mask = LVCF_FMT or LVCF_WIDTH or LVCF_TEXT  'マスクの設定(書式と幅と文字を弄るよ)
    clm.fmt = LVCFMT_LEFT           'カラムの書式(左詰でお願いします)
    clm.cx = 100                    'カラムの幅(とりあえず100で)
    For i = 0 to 2
        buf = "カラム" + Str$( i )
        clm.pszText = StrPtr( buf ) 'カラムに表示する文字
        SendMessage( hList, LVM_INSERTCOLUMN, i, VarPtr(clm) As Long) 'カラム作成
    Next
    Dim lvi As LVITEM   'リストビューアイテム構造体
    For i = 0 to 5
        lvi.mask = LVIF_TEXT or LVIF_PARAM  'マスクの設定(アイテムの文字と、固有32ビット値を弄るよ)
        lvi.lParam = i                      '固有32ビット値(とりあえず 0 )
        lvi.iItem = i                       'インデックス(縦方向)の位置
        lvi.iSubItem = 0                    'サブアイテム位置(横方向)、アイテム(先頭)を参照する場合は 0
        buf = "アイテム" + Str$( i )
        lvi.pszText = StrPtr( buf )         'レコード挿入時のアイテムの内容
        SendMessage( hList, LVM_INSERTITEM, 0, VarPtr(lvi) As Long) 'アイテム(つかアイテムの入ったレコード)を挿入
        'サブアイテムを格納してみる
        lvi.mask = LVIF_TEXT                'マスクの設定
        lvi.iSubItem = 1                    'カラム(横方向)位置
        buf = "サブアイテム" + Str$( 5 - i )
        lvi.pszText = StrPtr( buf )         'レコード挿入時の先頭アイテムの内容
        SendMessage( hList, LVM_SETITEM, 0, VarPtr(lvi) As Long)    'アイテムを格納
    Next
End Sub

/*リサイズされた*/
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
    MoveWindow( hList, 0, 0, cx, cy, 1 )    'リストビューの大きさを変更
End Sub

/*メニュー:アイテム取得*/
Sub MainWnd_IDM_GetItem_MenuClick()
    Dim lvi As LVITEM           'リストビューアイテムの構造体
    Dim buf[256] As Byte        'アイテム格納用
    Dim buf2 As String
    Dim i As Long
    'アイテム取得
    lvi.mask = LVIF_TEXT
    lvi.iItem = 0                   'インデックス(縦)
    lvi.pszText = VarPtr(buf[0])    '格納するバッファのポインタ
    lvi.cchTextMax = 256            '格納するサイズ(Byte)
    For i = 0 to 1
        lvi.iSubItem = i            'サブアイテム(横)
        SendMessage( hList, LVM_GETITEM, 0, VarPtr(lvi) As Long )   'アイテム取得
        buf2 = buf2 + MakeStr( buf As *Byte ) + " "
    Next
    '表示
    MessageBox( hMainWnd, buf2, "アイテム取得テスト", MB_OK )
End Sub



コメントの投稿

管理者にだけ表示を許可する

コメント

プロフィール

nakami

Author:nakami
可愛いテンプレートに似合う俺
うそAチームのスミス大佐

NAVI
カテゴリー
最近の記事
リンク
FC2カウンター
ブログ内検索
RSSフィード
sponsored link