TActionMainMenuBar Gradient Painting

时间:2012-08-18 10:25:15

标签: delphi delphi-xe

我试图通过创建从这个组件派生的自己的组件来扩展TActionMainMenuBar。

我要做的一件事是允许在菜单栏上绘制渐变。我设法做到了这一点但是当指定的TActionManager设置为XPStyle时,菜单项出现问题。

使用设置的不同TActionManager样式查看这些图像:

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

enter image description here enter image description here

当TActionManager设置为平台默认值时,背景显示正确,您可以看到渐变显示。

但是当TActionManager设置为XPStyle时,某些项目的渐变没有正确绘制,只需查看第一项:

XP风格(鼠标悬停和按下):

enter image description here enter image description here

你看得不太好看。

我已经在Paint中编辑了图像,以便大致了解我希望它看起来像什么:

鼠标悬停并已选中

enter image description here enter image description here

我认为这可以创建一些有趣的菜单样式。

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

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放入类似的面板容器中,然后将渐变绘制到面板上。

与此同时,我会留下这个问题以供进一步的意见和建议。

1 个答案:

答案 0 :(得分:2)

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