首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建与AdvancedDrawItem风格相同的tMenuItem?

如何创建与AdvancedDrawItem风格相同的tMenuItem?
EN

Stack Overflow用户
提问于 2018-08-21 00:49:40
回答 1查看 683关注 0票数 0

我想为东京VCL应用程序中弹出菜单的每个MenuItem添加一条特定颜色的线。风格是“紫晶Kamri”。

我调用每个MenuItem的AdvancedDrawItem事件,如下所示。然而,希尔加亮的盒子是扁平的,并且没有与非所有者画外观相同的3d形状。

平面背景(在橙色中):

当我想得到它的时候:

如何更好地实现它?Delphi 10.2,VCL。

代码语言:javascript
复制
procedure TForm1.mnuColorAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
var
  MenuItem : tMenuItem;
  LStyles  : TCustomStyleServices;
  LDetails : TThemedElementDetails;
begin
  MenuItem := (Sender as TMenuItem);
  LStyles  := StyleServices;

  ACanvas.Brush.Style := bsClear;

  ACanvas.Font.Color  := LStyles.GetStyleFontColor(sfPopupMenuItemTextNormal);

  //check the state
  if odSelected in State then
    begin
      ACanvas.Brush.Color := LStyles.GetSystemColor(clHighlight);
      ACanvas.Font.Color  := LStyles.GetSystemColor(clHighlightText);
    end;

  ACanvas.FillRect(ARect);
  ARect.Left := ARect.Left + 2;
  //draw the text
  ACanvas.TextOut(ARect.Left + 2, ARect.Top, MenuItem.Caption);

end;

谢谢,鲁隆

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 01:07:20

我或多或少找到了一个解决方案。问题出在使用Canvas FillRect。假设有三个PopUp菜单项,红色、绿色和蓝色。每个标签的线条颜色存储在每个标签字段中。每个菜单行由三个元素组成:复选标记、颜色行和标题。这三个项目都有一个共同的事件ColorAdvancedDrawItem。

所有的所有者绘制方法都基于Styles,而不是直接绘制画布,除了新的线条。请参见代码:

代码语言:javascript
复制
procedure TForm1.ColorAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
const
  CheckBoxWidth = 20;
  LineLen       = 25;
var
  MenuItem : tMenuItem;
  LStyles  : TCustomStyleServices;
  LDetails : TThemedElementDetails;
  CheckBoxRect, LineRect, TextRect: TRect;
  Y: integer;
begin
  MenuItem := (Sender as TMenuItem);
  LStyles  := StyleServices;

  // Draw Check box
  if MenuItem.Checked then
    begin
      LDetails := StyleServices.GetElementDetails(tmPopupCheckNormal);
      CheckBoxRect := ARect;
      CheckBoxRect.Width := CheckBoxWidth;
      LStyles.DrawElement(ACanvas.Handle, LDetails, CheckBoxRect);
    end;

  // Draw text
  // Check the state
  if odSelected in State then
    LDetails := StyleServices.GetElementDetails(tmPopupItemHot)
  else
    LDetails := StyleServices.GetElementDetails(tmPopupItemNormal);

  TextRect      := ARect;
  TextRect.Left := CheckBoxWidth + LineLen;
  LStyles.DrawText(ACanvas.Handle, LDetails, MenuItem.Caption, TextRect, [tfLeft, tfSingleLine, tfVerticalCenter]);

  // Draw Line
  ACanvas.Pen.Color := tColor(MenuItem.Tag);
  ACanvas.Pen.Width := 2;
  LineRect := ARect;
  LineRect.Left := CheckBoxWidth;
  LineRect.Width:= LineLen;
  Y := LineRect.Top + (LineRect.Height div 2);
  ACanvas.MoveTo(LineRect.Left+2, Y);
  ACanvas.LineTo(LineRect.Left + LineRect.Width - 2, Y);
end;

结果如下所示:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51935267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档