我正在尝试为我的应用程序模拟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;
如何为选定项目和热门项目绘制不同颜色的背景?
答案 0 :(得分:12)
尝试以下方法:
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组件的主题会删除默认选择矩形&amp;主题着色。 Control state flags的文档部分支持这一理论。