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

delphi – 如何在AdvancedCustomDrawItem期间绘制TTreeView的样

发布时间:2020-12-15 04:01:37 所属栏目:大数据 来源:网络整理
导读:我正在使用OnAdvancedCustomDrawItem事件从头开始自定义TTreeView绘图,我想知道如何在我的所有者绘制项目的背景中正确渲染这些选择和热矩形?它们是Vista / 7风格,所以我不能简单地用一些纯色填充背景. 我试图在cdPostPaint阶段绘制我的项目,但是如果我离开D
我正在使用OnAdvancedCustomDrawItem事件从头开始自定义TTreeView绘图,我想知道如何在我的所有者绘制项目的背景中正确渲染这些选择和热矩形?它们是Vista / 7风格,所以我不能简单地用一些纯色填充背景.

我试图在cdPostPaint阶段绘制我的项目,但是如果我离开DefaultDraw:= True atcdPrePaint阶段来绘制选择背景,则会发生完整的默认绘图,包括项目文本.

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages,DefaultDraw: Boolean);
begin
  case Stage of
    cdPreErase:
    begin
      DefaultDraw := True;
    end;

    cdPostErase:
    begin
      DefaultDraw := True;
    end;

    cdPrePaint:
    begin
      // I thought this will paint only the selected/hot backgrounds,// however this will paint whole item,including text.
      DefaultDraw := True;
    end;

    cdPostPaint:
    begin
      DefaultDraw := False;

      // painting my owner-draw text
      // .........
    end;
  end;

  PaintImages := False;
end;

解决方法

这是我的解决方案(已测试).

请注意,TreeView必须具有HotTrack:= True才能正常绘制热门项目.

未启用主题时,还必须有其他绘图.

uses
  UxTheme,Themes;

const
  TreeExpanderSpacing = 6;

procedure TForm1.DrawExpander(ACanvas: TCanvas; ATextRect: TRect; AExpanded: Boolean;
  AHot: Boolean);
var
  ExpanderRect: TRect;
  Graphics: IGPGraphics;
  Points: array of TGPPoint;
  Brush: IGPBrush;
  Pen: IGPPen;
  ThemeData: HTHEME;
  ElementPart: Integer;
  ElementState: Integer;
  ExpanderSize: TSize;
  UnthemedColor: TColor;
begin
  if ThemeServices.ThemesEnabled then
  begin
    if AHot then
      ElementPart := TVP_HOTGLYPH
    else
      ElementPart := TVP_GLYPH;

    if AExpanded then
      ElementState := GLPS_OPENED
    else
      ElementState := GLPS_CLOSED;

    ThemeData := OpenThemeData(TreeView1.Handle,VSCLASS_TREEVIEW);
    GetThemePartSize(ThemeData,ACanvas.Handle,ElementPart,ElementState,nil,TS_TRUE,ExpanderSize);
    ExpanderRect.Left := ATextRect.Left - TreeExpanderSpacing - ExpanderSize.cx;
    ExpanderRect.Right := ExpanderRect.Left + ExpanderSize.cx;
    ExpanderRect.Top := ATextRect.Top + (ATextRect.Bottom - ATextRect.Top - ExpanderSize.cy) div 2;
    ExpanderRect.Bottom := ExpanderRect.Top + ExpanderSize.cy;
    DrawThemeBackground(ThemeData,ExpanderRect,nil);
    CloseThemeData(ThemeData);
  end
  else
  begin

    // Drawing expander without themes enabled

    Graphics := TGPGraphics.Create(ACanvas.Handle);
    Graphics.SmoothingMode := SmoothingModeHighQuality;

    ExpanderRect := ATextRect;
    ExpanderRect.Right := ATextRect.Left - TDPIAware.GetScaledSize(TreeExpanderSpacing96dpi);
    ExpanderRect.Left := ATextRect.Left - TDPIAware.GetScaledSize(TreeExpanderSpacing96dpi) -
      TDPIAware.GetScaledSize(Max(TreeExpanderCollapsedWidth96dpi,TreeExpanderExpandedWidth96dpi));

    if ASelected then
      UnthemedColor := ColorToRGB(clHighlightText)
    else
      if AExpanded then
        UnthemedColor := clBlack
      else
        UnthemedColor := clGray;

    SetLength(Points,3);
    if AExpanded then
    begin
      Points[0] := TGPPoint.Create(ExpanderRect.Right,ExpanderRect.Top +
        (ExpanderRect.Bottom - ExpanderRect.Top - TreeExpanderExpandedHeight96dpi) div 2);
      Points[1] := TGPPoint.Create(ExpanderRect.Right,ExpanderRect.Top +
        (ExpanderRect.Bottom - ExpanderRect.Top + TreeExpanderExpandedHeight96dpi) div 2);
      Points[2] := TGPPoint.Create(ExpanderRect.Right - TreeExpanderExpandedWidth96dpi,ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top +
        TreeExpanderExpandedHeight96dpi) div 2);
      Brush := TGPSolidBrush.Create(TGPColor.CreateFromColorRef(UnthemedColor));
      Graphics.FillPolygon(Brush,Points);
    end
    else
    begin
      Points[0] := TGPPoint.Create(ExpanderRect.Right - TreeExpanderCollapsedWidth96dpi,ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top -
        TreeExpanderCollapsedHeight96dpi) div 2);
      Points[1] := TGPPoint.Create(ExpanderRect.Right,ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top) div 2);
      Points[2] := TGPPoint.Create(ExpanderRect.Right - TreeExpanderCollapsedWidth96dpi,ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top +
        TreeExpanderCollapsedHeight96dpi) div 2);
      Pen := TGPPen.Create(TGPColor.CreateFromColorRef(UnthemedColor));
      Graphics.DrawPolygon(Pen,Points);
    end;
  end;
end;

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages,DefaultDraw: Boolean);
var
  NodeRect: TRect;
  NodeTextRect: TRect;
  Text: string;
  ThemeData: HTHEME;
  TreeItemState: Integer;
begin
  if Stage = cdPrePaint then
  begin
    NodeRect := Node.DisplayRect(False);
    NodeTextRect := Node.DisplayRect(True);

    // Drawing background
    if (cdsSelected in State) and Sender.Focused then
      TreeItemState := TREIS_SELECTED
    else
      if (cdsSelected in State) and (cdsHot in State) then
        TreeItemState := TREIS_HOTSELECTED
      else
        if cdsSelected in State then
          TreeItemState := TREIS_SELECTEDNOTFOCUS
        else
          if cdsHot in State then
            TreeItemState := TREIS_HOT
          else
            TreeItemState := TREEITEMStateFiller0;

    if TreeItemState <> TREEITEMStateFiller0 then
    begin
      ThemeData := OpenThemeData(Sender.Handle,VSCLASS_TREEVIEW);
      DrawThemeBackground(ThemeData,Sender.Canvas.Handle,TVP_TREEITEM,TreeItemState,NodeRect,nil);
      CloseThemeData(ThemeData);
    end;

    // Drawing expander
    if Node.HasChildren then
      DrawExpander(Sender.Canvas,NodeTextRect,Node.Expanded,cdsHot in State);

    // Drawing main text
    SetBkMode(Sender.Canvas.Handle,TRANSPARENT);
    SetTextColor(Sender.Canvas.Handle,clBlue);

    Text := Node.Text;
    Sender.Canvas.TextRect(NodeTextRect,Text,[tfVerticalCenter,tfSingleLine,tfEndEllipsis,tfLeft]);

    // Some extended drawing...

  end;

  PaintImages := False;
  DefaultDraw := False;
end;

(编辑:李大同)

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

    推荐文章
      热点阅读