4

toThemeAwareが有効になっている場合、VirtualTrees.pasのバージョン5.0.0でのチェックボックス処理が壊れているように見えます。csUncheckedNormalであるノードは、チェック済み+ホットとして描画されます。

DrawElementを使用してチェックされていないテーマのチェックボックスを正しくペイントするには、Detailsレコードは次のようにする必要があります:Element = teButton、Part = 3、State = 5ただし、ノードがcsUncheckedNormalに設定されている場合、VirtualTrees.pasはState=1でDrawElementを呼び出すことになります。 。

VirtualTreesで宣言された間接参照と余分な定数がかなりあるように思われるので、これを修正する最善の方法がわかりません。アイデアを歓迎します...

(TVirtualStringTreeを画面に表示し、データを入力するための最小限のコードでさえ、ここに投稿するには少し時間がかかります。基本を除けば、これを再現するために必要なのは、TreeOptions.MiscOptionsでtoCheckSupportを有効にし、Node.CheckTypeを設定することだけです。 = InitNodeコールバックのctTriStateCheckBox。)

4

1 に答える 1

6

ええと、私はVirtualTreeViewがdelphi XE2に移植するときにVCLスタイルでカウントされないと思うので、これはあなたの問題を解決するために点灯するかもしれません。描画する前に要素の詳細を取得する必要があります。そうしないと、次のようなものが表示されます(VirtualTreeViewペイントチェックボックスの状態のシミュレーションです)。順序の違いとアーティファクトに注意してください。これは、同じコードを1回、VCLスタイルを無効にして、2回目を有効にした結果です。

ここに画像の説明を入力してください

私はかなり奇妙なことを知っていますが、なぜこれが起こっているのかあなたに答えることはできません。TThemeServices.GetElementDetails要素のレンダリングを正しく機能させるには、またはオプションで状態インデックスを自分で計算するか、オプションで計算する必要があることをお伝えします。次の修正を使用してみてください。

procedure TBaseVirtualTree.PaintCheckImage(Canvas: TCanvas; 
  const ImageInfo: TVTImageInfo; Selected: Boolean);
var
  // add a new variable for calculating TThemedButton state from the input
  // ImageInfo.Index; I hope ImageInfo.Index has the proper state order
  State: Integer;
begin
...
  case Index of
    0..8: // radio buttons
    begin
      // get the low index of the first radio button state and increment it by 
      // the ImageInfo.Index and get details of the button element
      State := Ord(TThemedButton(tbRadioButtonUncheckedNormal)) + Index - 1;
      Details := StyleServices.GetElementDetails(TThemedButton(State));
    end;
    9..20: // check boxes
    begin
      // get the low index of the first check box state and increment it by 
      // the ImageInfo.Index and get details of the button element
      State := Ord(TThemedButton(tbCheckBoxUncheckedNormal)) + Index - 9;
      Details := StyleServices.GetElementDetails(TThemedButton(State));
    end;
    21..24: // buttons
    begin
      // get the low index of the first push button state and increment it by 
      // the ImageInfo.Index and get details of the button element
      State := Ord(TThemedButton(tbPushButtonNormal)) + Index - 21;
      Details := StyleServices.GetElementDetails(TThemedButton(State));
    end;
  else
    Details.Part := 0;
    Details.State := 0;
  end;
...
end;

私はこれをすべてのチェックタイプでテストしましたが、うまくいきました。

于 2012-04-19T11:58:22.407 に答える