启用toThemeAware时,VirtualTrees.pas 5.0.0版中的复选框处理显示已损坏。 csUncheckedNormal的节点被绘制为checked + hot。
要使用DrawElement正确绘制未经检查的主题复选框,Details记录必须为:Element = teButton,Part = 3,State = 5.但是,当节点为时,VirtualTrees.pas最终调用DrawElement,State = 1设置为csUncheckedNormal。
在VirtualTrees中似乎有大量的间接和额外的常量,所以我不确定如何最好地解决这个问题。想法欢迎......
(即使是在屏幕上获取TVirtualStringTree并填充了一些数据的最小代码,也可以在此处发布。除了基础知识之外,重现这一点所需要的只是在TreeOptions.MiscOptions中启用toCheckSupport,并设置Node .CheckType:= initNode回调中的ctTriStateCheckBox。)
答案 0 :(得分:6)
好吧,因为我认为移植到delphi XE2时VirtualTreeView不计入VCL样式,这可能会解决您的问题。您必须在绘制之前获取元素详细信息,否则您将得到类似的内容(这是VirtualTreeView绘制复选框如何指出的模拟)。注意不同的顺序和工件;一旦禁用VCL样式,第二次启用,它就是相同代码的结果:
我很清楚,但我无法回答你为什么会这样。我可以告诉你,你应该调用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;
我已经针对所有检查类型对此进行了测试,它对我有用。