加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – TTreeView自定义绘制所选项目

发布时间:2020-12-15 04:18:40 所属栏目:大数据 来源:网络整理
导读:我正在尝试为我的应用程序模拟Outlook 2013左窗格树视图菜单.我正在使用CustomDraw,因为我只想更改一些简单的字体和背景属性. 这就是我想要的: 但是,我始终为选定节点和热跟踪节点获取默认选定的绘图.我没有Windows 7或XP来查看这是否是正常行为,或者它是否
我正在尝试为我的应用程序模拟Outlook 2013左窗格树视图菜单.我正在使用CustomDraw,因为我只想更改一些简单的字体和背景属性.

这就是我想要的:

但是,我始终为选定节点和热跟踪节点获取默认选定的绘图.我没有Windows 7或XP来查看这是否是正常行为,或者它是否与我的操作系统相关(Windows 8).

这是我得到的:

这是我的代码:

procedure TMainForm.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if Node.Level = 1 then
    Sender.Canvas.Font.Size := Sender.Canvas.Font.Size + 2;

  if cdsHot in State then
    Sender.Canvas.Brush.Color := $00F7E6CD
  else if (cdsSelected in State) or (cdsFocused in State) or
    (cdsChecked in State) then
    Sender.Canvas.Brush.Color := $00F2F2F2
  else
    Sender.Canvas.Brush.Color := $00DEDEDE;
  DefaultDraw := true;
end;

如何为选定和热门项目绘制不同颜色的背景?

解决方法

请尝试以下方法:
type
  TTreeView = class(Vcl.ComCtrls.TTreeView)
  protected
    procedure CreateWnd; override;
  end;


uses uxtheme;

procedure TTreeView.CreateWnd;
begin
  inherited;
  SetWindowTheme(Handle,nil,nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

   TreeView1.Font.Name := 'Segoe UI';
   TreeView1.HotTrack := True;
   TreeView1.Font.Size := TreeView1.Font.Size + 1;
   TreeView1.Color := $00DEDEDE;

end;

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin

   if cdsFocused in State then begin
     Sender.Canvas.Brush.Color := $00F2F2F2;
     Sender.Canvas.Font.Color := clblack;
     Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold];
   end else if cdsHot in State then
    Sender.Canvas.Brush.Color := $00F7E6CD
   else
    Sender.Canvas.Brush.Color := $00DEDEDE;

end;

说明:

关于这一点的微软文档令人难以置信的模糊,我可以肯定地说,每当在一个项目(节点)上执行一个动作(选择,热跟踪,取消选择等……)时,就会发送一条特定的消息,这个消息包括通过参数标志的节点状态,该标志最后在内部决定如何根据当前的Windows主题直观地更新项目.

这可能是为什么禁用TreeView组件的主题会删除默认选择矩形&主题着色. Control state flags的文档部分支持这一理论.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读