2006-06-10(Sat)

リストビュー第1回 リストビューを作ってみる

小休止 7 8 回

ActiveBasic の覚書的に色々書いてみる。
「とにかく○○なソフトが必要なのに一から調べてらんねー」という人には役立つかもしれないし、もう知っていることかもしれない。
全ては自分の仕事を便利にするために。

さて、俺的にはよく使う「リストビュー」について書く。
リストビューとはエクスプローラでおなじみのこんな感じのコントロール。(クリックで拡大)
クリックで拡大

4つの表示形態があるが、レポート表示タイプの使い方が判ると、ちょっと仕事で欲しいようなツールをサクっと作れるので便利だ。 というわけで、リストビューでも更に俺的に重宝しているレポート表示タイプについて書いてみる。
予定としては以下の8回に分けてリストビューの基本を書き留めておこうかと思っている。

第1回 リストビューを作ってみる
第2回 アイテムを格納してみる
第3回 リストビューのアイテムを取得してみる
小休止 便利なメッセージ
第4回 選択されているレコードを取得する
第5回 指定レコードを削除する
第6回 マウスの当たり判定
第7回 カラムをクリックしてソートする
第8回 レコードをドラッグして入れ替える

では1回目の本文へいってみよ。
第1回 リストビューを作ってみる

1) リストビューの配置と設定
ProjectEditor から LV_SAMPLE というプロジェクトを作成。
「コモンコントロールを使用する」のチェックはON
ON にしないとリストビュー関係の色々がインクルードされない。色々ってのはアレだ、ほら、アレ。気になる人は ActiveBasic インストールディレクトリの Include\api_commctrl.sbp を見れ。

作成したらまっさらなメインウィンドウが RAD ツールに配置される。
そのメインウィンドウにリストビューを配置する。折角あるから RAD ツールを使おう。

これでリストビューの配置は完了。
このメインウィンドウと、配置したリストビューに対してコードを書いていく。

リストビューには先にも書いた4つの表示タイプがあるわけだが、今回はレポート表示タイプについてやっていくので、RAD ツールでは図のように「レポート」を指定する。

その他の設定部分は、プログラムの用途によって都合のよいものに変えることになる。
第2回の「アイテムを格納してみる」まで進んだら色々チェックを ON/OFF してどう変わるのか弄ってみると良い。

2) 初期設定
リストビュー初期設定のためのコードを書く。
RAD からメインウィンドウを右クリックして、「イベントコード」をクリック。

どのイベント処理に対してコードを書くかリストが出るので、「WM_CREATE ウィンドウ作成時」をダブルクリックする。
すると MainWnd.sbp が開き、ウィンドウ作成時に実行される関数( Sub MainWnd_Create ~ End Sub )が記入された状態になっている。 ウィンドウが作成された時に実行したい内容は、その SubEndSub の中に書く。

さてその前に、プログラムからリストビューにあれこれ指示を出すとき、そのリストビューのハンドルというものが必要になる。 例えば機械を操作するときハンドルで操縦するあのイメージ。(だと思う。違うかな?)

毎回リストビューのハンドルを取得するのは面倒だから、最初にグローバル変数を定義して、そこへリストビューのハンドルを代入しておくことにする。
まず、プログラムの先頭でグローバル変数を定義。
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim hList As HWND   'リストビューのハンドル代入用グローバル変数

で、ウィンドウ作成時の処理( Sub MainWnd_Create ~ End Sub )にリストビューのハンドルを取得するコードを書く。
/*ウィンドウ作成時*/
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    'リストビュー初期設定
    hList = GetDlgItem( hMainWnd, ListView11 )   'リストビューのハンドルを取得
End Sub

これでリストビューのハンドルを取得できた。

次はプログラムが起動したらリストビューが親ウィンドウ一杯に広がるようにしておく。
先ほどのように、RAD でメインウィンドウを右クリックし、「イベントコード」から「WM_SIZE ウィンドウの大きさが変更された時」を選び、以下のコードを挿入。
/*リサイズされた*/
Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
    MoveWindow( hList, 0, 0, cx, cy, 1 )    'リストビューの大きさを変更
End Sub

cx cy にはメインウィンドウの幅と高さが入ってくるので、そのまま MoveWindow でサイズ変更してやる。


さて、ここまでで普通にリストビューを使う分には問題ない。
んが、最後にリストビューの拡張スタイルを設定してみる。
どうせならカッコいいほうが強いじゃん。
ということで、ウィンドウ作成時の処理に以下の1行を追加する。(便宜上折り返してるけど)
/*ウィンドウ作成時*/
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)    'スタイル設定
End Sub

上のリストでは、罫線を引く選択すると行全体の色が変わるスクロールバーをフラットに、というスタイルにしてみた。色々パラメータを変えて、用途などに合わせ好みの設定にするといい。

SendMessage はコントロールに指示を送る関数。
ここではリストビューのハンドルである hListLVM_SETEXTENDEDLISTVIEWSTYLE というメッセージを送っている。

SendMessage のパラメータは lParamwParam の2つがある。
今回の LVM_SETEXTENDEDLISTVIEWSTYLE の場合は、全てのスタイルを変更するために lParam0 を指定し、スタイルの指定を wParam に与えている。

このあたりはウィンドウズメッセージについて検索すると沢山出てくる。
その他のスタイルについては次の通り。これも詳しくは検索するのだ。

LVS_EX_GRIDLINES罫線を引く
LVS_EX_SUBITEMIMAGESイメージをサブアイテムに表示する
LVS_EX_CHECKBOXESアイテムにチェックボックスをつける
LVS_EX_TRACKSELECTマウスカーソルが乗って一定時間で選択状態になる
(カーソルが乗ると色変化)
LVS_EX_HEADERDRAGDROPヘッダをD&Dするとカラム順序を入れ替えできる
LVS_EX_FULLROWSELECT選択時に行全体を強調表示
LVS_EX_ONECLICKACTIVATEクリック時、親ウィンドウへ LVN_ITEMACTIVATE を通知
(カーソルが乗ると色変化)
LVS_EX_TWOCLICKACTIVATEWクリック時、親ウィンドウへ LVN_ITEMACTIVATE を通知
(カーソルが乗ると色変化)
LVS_EX_FLATSBフラットスクロールバー
LVS_EX_UNDERLINEHOTLVS_EX_ONECLICKACTIVATE 又は LVS_EX_TWOCLICKACTIVATE の時、
カーソル行に下線
LVS_EX_UNDERLINECOLDLVS_EX_ONECLICKACTIVATE 又は LVS_EX_TWOCLICKACTIVATE の時、
アイテムに下線


これでリストビューの配置が完了。実行するとこんな感じになる。


以下、ここまでの 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 )   'スタイル設定
End Sub

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

コメントの投稿

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

コメント

プロフィール

nakami

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

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