チェックボックスのノードに3ステートの無効(中間)を付けるには?

解決


稲庭  2008-05-24 05:18:28  No: 30776

いつも拝見させていただいております。

早速ですが、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()を使うことでチェックボックスのグレー表示なども可能かと。」


稲庭  2008-05-24 05:42:12  No: 30777

すみません。タイトルを誤りました。
×チェックボックスのノードに3ステートの無効(中間)を付けるには?
○TTreeViewのノードに、チェックボックスの3ステート"無効(中間)"を付けるには?


おやじギャグ?  2008-05-26 03:16:29  No: 30778

真琴:「ねぇ、カイトさん、"無効(中間)"って、チェックボックスを淡色の灰色にしたいのよね?」
海都:「ソコのところがイマイチよく分からないけど、もし、そういうコトなら…」
  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して使ってイイの?」
海都:「ぅん、イイんじゃない?」


稲庭  2008-05-27 04:06:03  No: 30779

おやじギャグ?様、無事解決しました。

>「SetWindowLongの場合の表示はOSが用意したImageだけど、StateImages設定では自前のImageだから自由に変えられる」
かたくなに、OSに処理させようと情報を探していた事が視野を狭めていました。もしかしたら、OSからチェックボックスの状態別Imageを取り出す方法もあるのかなと思っています。そのことについては、また調べて行きたいと思います。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加