3

我正在尝试通过创建我自己的从该组件派生的组件来扩展 TActionMainMenuBar。

我想做的一件事是允许沿菜单栏绘制渐变。我已经设法做到了,但是当分配的 TActionManager 设置为 XPStyle 时,菜单项会出现问题。

查看这些具有不同 TActionManager 样式集的图像:

平台默认值(鼠标悬停并按下):

在此处输入图像描述 在此处输入图像描述

当 TActionManager 设置为 Platform Default 时,背景会正确显示,您可以很好地看到渐变显示。

然而,当 TActionManager 设置为 XPStyle 时,某些项的渐变绘制不正确,只需查看第一项:

XP 样式(鼠标悬停并按下):

在此处输入图像描述 在此处输入图像描述

如您所见,外观并不好。

我已经在 Paint 中编辑了图像,大致了解了我希望它的外观:

鼠标悬停并选中

在此处输入图像描述 在此处输入图像描述

我认为这将允许创建一些有趣的菜单样式。

这是我到目前为止的代码:

unit uMyMenu;

interface

uses
  Classes,
  Types,
  Graphics,
  GraphUtil,
  ActnMan,
  ActnCtrls,
  ActnMenus,
  PlatformDefaultStyleActnCtrls,
  XPActnCtrls,
  XPStyleActnCtrls;

type
  TMyActionMenu = class(TActionMainMenuBar)
  private
    FColorStart: TColor;
    FColorEnd: TColor;

    procedure SetColorStart(AValue: TColor);
    procedure SetColorEnd(AValue: TColor);
  protected
    procedure Paint(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ColorStart: TColor read FColorStart write SetColorStart default clSkyBlue;
    property ColorEnd: TColor read FColorEnd write SetColorEnd default clHighlight;
  end;

procedure Register;

implementation

{ TMyActionMenu }

constructor TMyActionMenu.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  SetColorStart(clSkyBlue);
  SetColorEnd(clHighlight);
  ParentBackground := True;
  ParentColor := False;
  OnPaint := Paint;
end;

destructor TMyActionMenu.Destroy;
begin
  inherited;
end;

procedure TMyActionMenu.SetColorStart(AValue: TColor);
begin
  if FColorStart <> AValue then
  begin
    FColorStart := AValue;
    Invalidate;
  end;
end;

procedure TMyActionMenu.SetColorEnd(AValue: TColor);
begin
  if FColorEnd <> AValue then
  begin
    FColorEnd := AValue;
    Invalidate;
  end;
end;

procedure TMyActionMenu.Paint(Sender: TObject);
var
  Rect: TRect;
begin
  Rect := GetClientRect;

  GradientFillCanvas(TMyActionMenu(Sender).Canvas, FColorStart,
    FColorEnd, Rect, gdVertical);
end;

procedure Register;
begin
  RegisterComponents('Standard', [TMyActionMenu]);
end;

end.

我不确定从哪里开始或改变什么,所以我期待看到您的评论和答案。

更新

例如,将 TActionMainMenuBar 放置在渐变面板中,将 ParentBackground 设置为 True 更合适。所以我应该考虑使用 SetSubComponent 并将我的 TMyActionMenu 放入类似的面板容器中,然后以这种方式将渐变绘制到面板上。

同时,尽管我将把这个问题留给进一步的意见和建议。

4

1 回答 1

2

有一个俄罗斯组件也可以进行渐变绘画。我没有测试它,我什至不知道它是否满足你的要求,但也许你从他们的源代码中得到一些想法。这是链接(我使用谷歌翻译将网站翻译成英文): http://translate.google.com/translate?langpair=ru|en&u=http%3A%2F%2Fwww.roschinspb.narod.ru%2Fdevelop。 html

于 2012-08-19T10:38:52.793 回答