プログラミング質問掲示板でwatara氏がすばらしいサンプルを作ってくださったので転載します。
'サンプル1
『user32.dll』の、『int SetWindowLongA(int,int,int)』を、
『?,?,?』の、『ウィンドウ情報設定』として、DLLを利用。
『user32.dll』の、『int GetWindowLongA(int,int)』を、
『?,?』の、『ウィンドウ情報取得』として、DLLを利用。
『user32.dll』の、『int SendMessageA(int,DWORD,int,char*)』を、
『?,?,?,?』の、『ポインタでメッセージ送信』として、DLLを利用。
TVM_GETNEXTITEM = $110A;
TVM_GETITEM = $110C;
TVM_SETITEMHEIGHT = $111B;
『ツリーアイテム状態取得』を、『?の』で、関数定義。
'■ツリーの作成
テストを、ツリーとして、作成。
その、アイテムは、『果物\りんご\王林
果物\りんご\ジョナゴールド
果物\みかん
野菜\キャベツ
野菜\トマト』
'■スタイルを変更
'ツリーのスタイルにTVS_CHECKBOXES($100)を足して、チェックボックスを付ける。
ウィンドウ情報取得( (テストの、ハンドル),(-16{GWL_STYLE}))
それ=OR(それ,$100)。
ウィンドウ情報設定( (テストの、ハンドル),(-16{GWL_STYLE}),それ)
'チェックボックスの下部が欠けるのでツリーアイテムの高さを16ピクセルに調節。
テストに、「{TVM_SETITEMHEIGHT},16,0」と、メッセージ送信。
ツリー状態ボタンを、作る。
その、テキストは、「全アイテムの状態」
その、イベントは、(
集計は、(テストの、アイテム)。
'閉じたままでの列挙は面倒なので全て展開させる。
テストの、「」を、ツリー展開。
'先頭のアイテムのハンドルを取得
テストに、「{TVM_GETNEXTITEM},$0,0」と、メッセージ送信。//TVGN_ROOT
アイテムハンドルへ、入れる。
(アイテムハンドル<>0)で、ループ(
アイテムハンドルの、ツリーアイテム状態取得。
それ=(AND(それ,$2000)=$2000)。'$2000を含めばチェック状態。
集計#(回数-1)=「{それ},{集計#(回数-1)}」。
'次のアイテムのハンドルを取得。次が無ければ0になる。
テストに、「{TVM_GETNEXTITEM},$6,{アイテムハンドル}」と、メッセージ送信。//TVGN_NEXTVISIBLE
アイテムハンドルへ、入れる。
)
「{集計}」と、言う。
)
選択アイテム状態ボタンを、作る。
その、テキストは、「選択中アイテムの状態」
その、イベントは、(
'選択中のアイテムのハンドルをそれに得る
テストに、「{TVM_GETNEXTITEM},$9,0」と、メッセージ送信。//TVGN_CARET
それの、ツリーアイテム状態取得。
それ=(AND(それ,$2000)=$2000)。'$2000を含めばチェック状態。
もし、それが、はいならば、(
「{テスト}は、チェックされています」と、言う。
)違えば、(
「{テスト}は、チェックされていません。」と、言う。
)
)
待機。
'---------------------------------------------
*ツリーアイテム状態取得
'"テスト"という名前のツリー部品から、
'ハンドルで指定されたアイテムの状態を取得する。
引数取得。
アイテム情報に、40バイトを、確保。
$8を、アイテム情報の、1に、『DWORD』形式で、バイナリ設定。
それを、アイテム情報の、5に、『DWORD』形式で、バイナリ設定。
ポインタでメッセージ送信((テストの、ハンドル), TVM_GETITEM, 0, アイテム情報)
アイテム情報の、$9を、『DWORD』形式で、バイナリ取得。
戻る。
作成日 2003/07/11 作成時のひまわりバージョン 1.77