使用Explorer主题的Virtual TreeView选择宽度问题

7
当我使用TVirtualStringTree.PaintOptions中的toUseExplorerTheme时,它会像这样绘制选择内容:
请注意,所选内容从控件的左侧延伸到任何节点标题最右侧的位置;所有选择内容的宽度都相同。
我希望它看起来像这个图像(使用Virtual TreeView的他人项目),其中选择仅覆盖节点标题的文本:
除非Virtual TreeView中有退化(我正在使用5.2.2),否则这一定是可能的,但我找不到正确的选项组合。
这是我的设置代码:
fTree := TVirtualStringTree.Create(Self);
fTree.Parent            := Self;
fTree.Align             := alClient;

fTree.OnGetText         := TreeGetText;
fTree.OnInitNode        := TreeInitNode;
fTree.OnInitChildren    := TreeInitChildren;
fTree.OnChange          := TreeSelectionChange;
fTree.RootNodeCount     := 1;
fTree.DrawSelectionMode := smBlendedRectangle;

fTree.TreeOptions.PaintOptions     := fTree.TreeOptions.PaintOptions
                                      + [toUseExplorerTheme];
fTree.TreeOptions.SelectionOptions := fTree.TreeOptions.SelectionOptions
                                      + [toMultiSelect];

多选时出现不整齐的边缘?哎呀…… 我想品味因人而异,但这看起来会显得有些…凌乱?赞一个好问题。 - Marjan Venema
@Marjan,多样性是生活的调味品 :-) - TLama
@MarjanVenema 另一种选择是使用跨越整个宽度的资源管理器样式选择,但是这样就更难/不可能在选择范围之外单击以取消选择。无论如何,我喜欢不齐的右边缘。 - Ian Goldby
没关系,虽然你可能会在 [ux.se] 上受到抨击 :-) - Marjan Venema
1个回答

6

抱歉,那是我的错。我在这个问题中提出的陈述应该是:

procedure DrawBackground(State: Integer);
begin
  // if the full row selection is disabled or toGridExtensions is in the MiscOptions, draw the selection
  // into the InnerRect, otherwise into the RowRect
  if not (toFullRowSelect in FOptions.FSelectionOptions) or (toGridExtensions in FOptions.FMiscOptions) then
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil)
  else
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, RowRect, nil);
end;

同样也适用于下一个嵌套过程DrawThemedFocusRect。修复现已提交至修订版r587,请更新您的Virtual Treeview。感谢@joachim的合作!


@Joachim,哇,你太快了。但是,你能否也对DrawThemedFocusRect嵌套过程进行类似的操作?因为我昨天很忙,所以今天打算提交一个问题。谢谢你,对于这个问题我很抱歉! - TLama
谢谢。我在使用Virtual TreeView的第一小时就发现了这个问题,真的不敢相信我找到了一个没有被其他人注意到的错误!结果证明这次我错了;-) 不确定我的问题是否值得这么多赞... Virtual TreeView必须是一个噩梦,因为有太多可配置的选项需要测试。 - Ian Goldby
@TLama:在r587中,DrawThemedFocusRect()也完成了。您介意审核一下代码更改吗? - Joachim Marder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接