ええと、私は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;
私はこれをすべてのチェックタイプでテストしましたが、うまくいきました。