【问题标题】:How to make TTreeView not highlight all nodes when disabled?禁用时如何使 TTreeView 不突出显示所有节点?
【发布时间】:2020-06-09 14:37:00
【问题描述】:

我在我的应用程序中使用 VCL 样式,特别是使用黑色和白色文本的“Windows 10 dark”。然后我有一个TTreeView 控件,它显示得非常好。但是,当用户进入“编辑”模式时,我禁用了TTreeView,当它被禁用时,它看起来非常难看,每个节点都突出显示。

如何使它在禁用时显示正常,而不突出显示所有节点,而仅突出显示当前选定的节点?

注意:我试图避免自定义绘图。虽然这看起来是必要的行动方案,但我真的不打算让这个解决方案变得超级复杂,因此虚拟树视图等替代方案不在图片中。


编辑

我已尝试实施推荐的“solution”,但无济于事。这是我添加的内容:

procedure TfrmTopics.TopicTreeAdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: Boolean);
begin
  inherited;
  if (not TopicTree.Enabled) and
    (GetWindowTheme(TopicTree.Handle) = 0) and (Stage = cdPrePaint) then
  begin
    DefaultDraw:= True; // False; //Tried both ways...
    TopicTree.Canvas.Brush.Color := TopicTree.Color;
    TopicTree.Canvas.Font.Color := clWhite; 
    TopicTree.Canvas.Pen.Color:= clWhite;
  end;
end;

它只绘制当前选定节点的文本——而不是其余的。我假设它与深色风格和压倒一切的颜色有关......

顺便说一句,TTreeView.StyleElements 禁用了 seFontseClient

【问题讨论】:

  • 相关:How to disable a TreeView control without selecting all nodes?。接受的答案建议自定义绘图。
  • @PeterWolf Geez,实际上我在询问之前搜索了 Google 和 Stack Overflow,并没有遇到那个。
  • @PeterWolf 但是没有成功。该答案不考虑 VCL 样式,虽然我已经根据需要调整了代码,但最终整个控件显示为空白。一段时间后会回到这个...
  • 是的,这就是为什么这不是骗局。在该问题下的评论中,我建议禁用容器作为快速解决方法,但是您将失去视觉状态指示,正如 Sertac 指出的那样。
  • 我真的很讨厌 VCL 风格,这个想法很不错,但实现实在是太糟糕了,漏洞百出,它经常被破坏,Embarcadero 似乎无法让它正常工作。这就是为什么我只使用 Windows 样式而从不使用 VCL 样式的原因

标签: delphi treeview vcl-styles


【解决方案1】:

使用来自https://github.com/RRUZ/vcl-styles-utilsVCL Styles Utils组件

在您的项目中包含Vcl.Styles.Hooks

【讨论】:

  • 最优秀,更好看。现在,如果我能弄清楚如何保持当前选定的节点突出显示...
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多