gpt4 book ai didi

delphi - TVirtualStringTree 中主题复选框绘制不正确

转载 作者:行者123 更新时间:2023-12-03 15:25:53 25 4
gpt4 key购买 nike

当启用 toThemeAware 时,VirtualTrees.pas 5.0.0 版本中的复选框处理似乎已损坏。 csUncheckedNormal 的节点被绘制为选中 + 热。

要使用 DrawElement 正确绘制未选中的主题复选框,详细信息记录必须为:Element = teButton、Part = 3 和 State = 5。但是,当节点处于设置为 csUncheckedNormal。

VirtualTrees 中似乎声明了很多间接和额外的常量,所以我不确定如何最好地解决这个问题。欢迎提出想法...

(即使是在屏幕上获取 TVirtualStringTree 并填充一些数据的最小代码,发布在这里也有点冗长。除了基础知识之外,重现此操作所需的只是在 TreeOptions.MiscOptions 中启用 toCheckSupport,并设置 Node InitNode 回调中的 .CheckType := ctTriStateCheckBox。)

最佳答案

好吧,因为我认为在移植到delphi XE2时VirtualTreeView不计入VCL样式,所以这可能会解决你的问题。在绘制元素之前,您必须获取元素详细信息,否则您将得到类似的内容(它是 VirtualTreeView 绘制复选框状态的模拟)。注意不同的顺序和工件;这是相同代码一次禁用 VCL 样式、第二次启用的结果:

enter image description here

我知道这很奇怪,但我无法回答你为什么会发生这种情况。我可以告诉你,你应该调用 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;

我已经针对所有支票类型对此进行了测试,它对我有用。

关于delphi - TVirtualStringTree 中主题复选框绘制不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10215780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com