いつも拝見させていただいております。
早速ですが、TTreeViewの各ノードに、下記の方法を参考にチェックボックスを表示させています。
このチェックボックスの状態に、3ステートの無効(OnでもOffでもない)状態にできませんでしょうか?
また、その場合にクリックによるチェック状態の制御についてもご存じでしたらお願いいたします。
http://hiderin.air-nifty.com/delphi/2007/08/index.html#entry-20275606 (下記ソース参考元)
uses
Commctrl;
const
TVIS_CHECKED = $2000;
// ウィンドウスタイルの設定---チェックボックスを設定します。
procedure TForm1.FormCreate(Sender: TObject);
var
WindowStyles: Integer;
I: Integer;
begin
WindowStyles := GetWindowLong(TreeView1.Handle, GWL_STYLE);
SetWindowLong(TreeView1.Handle, GWL_STYLE, WindowStyles or TVS_CHECKBOXES);
また、下のような話が載っていたのですが、いろいろと探しましたが糸口になることも見つけられませんでした。
よろしくお願いします。
http://okwave.jp/qa3900528.html (下記情報の引用もと)
「TreeView_SetItemState()のstateでINDEXTOSTATEIMAGEMASK()を使うことでチェックボックスのグレー表示なども可能かと。」
すみません。タイトルを誤りました。
×チェックボックスのノードに3ステートの無効(中間)を付けるには?
○TTreeViewのノードに、チェックボックスの3ステート"無効(中間)"を付けるには?
真琴:「ねぇ、カイトさん、"無効(中間)"って、チェックボックスを淡色の灰色にしたいのよね?」
海都:「ソコのところがイマイチよく分からないけど、もし、そういうコトなら…」
TreeView1.StateImages := ImageListChkBox;
海都:「ImageListを貼り付けて、↑このように ImageListChkBoxの名前でTreeView1のStateImagesに設定しておいて…」
真琴:「中身は空のままでいいの?」
海都:「いや、このBMPファイルから Imageをあらかじめ追加しておく、それで…」
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
MASK_CHECK = $0006;
MASK_ENABLE = $0001;
var
Node: TTreeNode;
function Grayed: Boolean;
begin
result := (Node.StateIndex and MASK_ENABLE <> 0);
end;
begin
with TTreeView(Sender) do begin
Node := GetNodeAt(X, Y);
if Node = nil then exit;
if htOnStateIcon in GetHitTestInfoAt(X, Y) then begin
// チェックボックスがクリックされた
if (ssLeft in Shift)and(not Grayed) then Node.StateIndex := Node.StateIndex xor MASK_CHECK;
if ssRight in Shift then Node.StateIndex := Node.StateIndex xor MASK_ENABLE;
Selected := Node;
end;
end;
end;
海都:「チェックボックスの所を右クリックすると、有効と無効が切り換わる」
真琴:「あ、無効の時は、左クリックしても ON/OFFが切り換わらないようになってるのね」
海都:「そうだよ」
真琴:「カイトさん、これって、SetWindowLongを使ってないよね、ナンで?」
海都:「ジツは、SetWindowLongでCheckBoxを付けるのは、StateImagesを設定するのと同じなんだよ」
真琴:「えっ、そうなんだ」
海都:「SetWindowLongの場合の表示はOSが用意したImageだけど、StateImages設定では自前のImageだから自由に変えられる」
広海:「だけどぉ、このImage、自分で作らなきゃダメってコトだろ?カイトくん」
真琴:「そうよね〜、それも面倒っていうか大変よねぇ」
海都:「はいはい、センパイ方のおっしゃること、マコトにごもっとも…」
真琴:「あの〜^^、もしかしてぇ、イマの、おやじギャグ?」
広海:「だよねぇ」
海都:「ワカッタ?^^; …これは、以前オレが作ってココ↓にUPしておいたImage、それをDLしてImageListChkBoxに入れたんだ」
http://kaito.es.land.to/lime/lime.cgi?chkbox
真琴:「それって、ダレでもDLして使ってイイの?」
海都:「ぅん、イイんじゃない?」
おやじギャグ?様、無事解決しました。
>「SetWindowLongの場合の表示はOSが用意したImageだけど、StateImages設定では自前のImageだから自由に変えられる」
かたくなに、OSに処理させようと情報を探していた事が視野を狭めていました。もしかしたら、OSからチェックボックスの状態別Imageを取り出す方法もあるのかなと思っています。そのことについては、また調べて行きたいと思います。
ありがとうございました。
ツイート | ![]() |