Advertisement
Guest User

Untitled

a guest
Jun 26th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.60 KB | None | 0 0
  1. procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  2. Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages,
  3. DefaultDraw: Boolean);
  4. begin
  5. case Stage of
  6. cdPreErase:
  7. begin
  8. DefaultDraw := True;
  9. end;
  10.  
  11. cdPostErase:
  12. begin
  13. DefaultDraw := True;
  14. end;
  15.  
  16. cdPrePaint:
  17. begin
  18. // I thought this will paint only the selected/hot backgrounds,
  19. // however this will paint whole item, including text.
  20. DefaultDraw := True;
  21. end;
  22.  
  23. cdPostPaint:
  24. begin
  25. DefaultDraw := False;
  26.  
  27. // painting my owner-draw text
  28. // .........
  29. end;
  30. end;
  31.  
  32. PaintImages := False;
  33. end;
  34.  
  35. uses
  36. UxTheme,
  37. Themes;
  38.  
  39. const
  40. TreeExpanderSpacing = 6;
  41.  
  42. procedure TForm1.DrawExpander(ACanvas: TCanvas; ATextRect: TRect; AExpanded: Boolean;
  43. AHot: Boolean);
  44. var
  45. ExpanderRect: TRect;
  46. Graphics: IGPGraphics;
  47. Points: array of TGPPoint;
  48. Brush: IGPBrush;
  49. Pen: IGPPen;
  50. ThemeData: HTHEME;
  51. ElementPart: Integer;
  52. ElementState: Integer;
  53. ExpanderSize: TSize;
  54. UnthemedColor: TColor;
  55. begin
  56. if ThemeServices.ThemesEnabled then
  57. begin
  58. if AHot then
  59. ElementPart := TVP_HOTGLYPH
  60. else
  61. ElementPart := TVP_GLYPH;
  62.  
  63. if AExpanded then
  64. ElementState := GLPS_OPENED
  65. else
  66. ElementState := GLPS_CLOSED;
  67.  
  68. ThemeData := OpenThemeData(TreeView1.Handle, VSCLASS_TREEVIEW);
  69. GetThemePartSize(ThemeData, ACanvas.Handle, ElementPart, ElementState, nil,
  70. TS_TRUE, ExpanderSize);
  71. ExpanderRect.Left := ATextRect.Left - TreeExpanderSpacing - ExpanderSize.cx;
  72. ExpanderRect.Right := ExpanderRect.Left + ExpanderSize.cx;
  73. ExpanderRect.Top := ATextRect.Top + (ATextRect.Bottom - ATextRect.Top - ExpanderSize.cy) div 2;
  74. ExpanderRect.Bottom := ExpanderRect.Top + ExpanderSize.cy;
  75. DrawThemeBackground(ThemeData, ACanvas.Handle, ElementPart, ElementState, ExpanderRect, nil);
  76. CloseThemeData(ThemeData);
  77. end
  78. else
  79. begin
  80.  
  81. // Drawing expander without themes enabled
  82.  
  83. Graphics := TGPGraphics.Create(ACanvas.Handle);
  84. Graphics.SmoothingMode := SmoothingModeHighQuality;
  85.  
  86. ExpanderRect := ATextRect;
  87. ExpanderRect.Right := ATextRect.Left - TDPIAware.GetScaledSize(TreeExpanderSpacing96dpi);
  88. ExpanderRect.Left := ATextRect.Left - TDPIAware.GetScaledSize(TreeExpanderSpacing96dpi) -
  89. TDPIAware.GetScaledSize(Max(TreeExpanderCollapsedWidth96dpi, TreeExpanderExpandedWidth96dpi));
  90.  
  91. if ASelected then
  92. UnthemedColor := ColorToRGB(clHighlightText)
  93. else
  94. if AExpanded then
  95. UnthemedColor := clBlack
  96. else
  97. UnthemedColor := clGray;
  98.  
  99. SetLength(Points, 3);
  100. if AExpanded then
  101. begin
  102. Points[0] := TGPPoint.Create(ExpanderRect.Right, ExpanderRect.Top +
  103. (ExpanderRect.Bottom - ExpanderRect.Top - TreeExpanderExpandedHeight96dpi) div 2);
  104. Points[1] := TGPPoint.Create(ExpanderRect.Right, ExpanderRect.Top +
  105. (ExpanderRect.Bottom - ExpanderRect.Top + TreeExpanderExpandedHeight96dpi) div 2);
  106. Points[2] := TGPPoint.Create(ExpanderRect.Right - TreeExpanderExpandedWidth96dpi,
  107. ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top +
  108. TreeExpanderExpandedHeight96dpi) div 2);
  109. Brush := TGPSolidBrush.Create(TGPColor.CreateFromColorRef(UnthemedColor));
  110. Graphics.FillPolygon(Brush, Points);
  111. end
  112. else
  113. begin
  114. Points[0] := TGPPoint.Create(ExpanderRect.Right - TreeExpanderCollapsedWidth96dpi,
  115. ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top -
  116. TreeExpanderCollapsedHeight96dpi) div 2);
  117. Points[1] := TGPPoint.Create(ExpanderRect.Right,
  118. ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top) div 2);
  119. Points[2] := TGPPoint.Create(ExpanderRect.Right - TreeExpanderCollapsedWidth96dpi,
  120. ExpanderRect.Top + (ExpanderRect.Bottom - ExpanderRect.Top +
  121. TreeExpanderCollapsedHeight96dpi) div 2);
  122. Pen := TGPPen.Create(TGPColor.CreateFromColorRef(UnthemedColor));
  123. Graphics.DrawPolygon(Pen, Points);
  124. end;
  125. end;
  126. end;
  127.  
  128. procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  129. Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages,
  130. DefaultDraw: Boolean);
  131. var
  132. NodeRect: TRect;
  133. NodeTextRect: TRect;
  134. Text: string;
  135. ThemeData: HTHEME;
  136. TreeItemState: Integer;
  137. begin
  138. if Stage = cdPrePaint then
  139. begin
  140. NodeRect := Node.DisplayRect(False);
  141. NodeTextRect := Node.DisplayRect(True);
  142.  
  143. // Drawing background
  144. if (cdsSelected in State) and Sender.Focused then
  145. TreeItemState := TREIS_SELECTED
  146. else
  147. if (cdsSelected in State) and (cdsHot in State) then
  148. TreeItemState := TREIS_HOTSELECTED
  149. else
  150. if cdsSelected in State then
  151. TreeItemState := TREIS_SELECTEDNOTFOCUS
  152. else
  153. if cdsHot in State then
  154. TreeItemState := TREIS_HOT
  155. else
  156. TreeItemState := TREEITEMStateFiller0;
  157.  
  158. if TreeItemState <> TREEITEMStateFiller0 then
  159. begin
  160. ThemeData := OpenThemeData(Sender.Handle, VSCLASS_TREEVIEW);
  161. DrawThemeBackground(ThemeData, Sender.Canvas.Handle, TVP_TREEITEM, TreeItemState,
  162. NodeRect, nil);
  163. CloseThemeData(ThemeData);
  164. end;
  165.  
  166. // Drawing expander
  167. if Node.HasChildren then
  168. DrawExpander(Sender.Canvas, NodeTextRect, Node.Expanded, cdsHot in State);
  169.  
  170. // Drawing main text
  171. SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
  172. SetTextColor(Sender.Canvas.Handle, clBlue);
  173.  
  174. Text := Node.Text;
  175. Sender.Canvas.TextRect(NodeTextRect, Text,
  176. [tfVerticalCenter, tfSingleLine, tfEndEllipsis, tfLeft]);
  177.  
  178. // Some extended drawing...
  179.  
  180. end;
  181.  
  182. PaintImages := False;
  183. DefaultDraw := False;
  184. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement