我试图通过创建从这个组件派生的自己的组件来扩展TActionMainMenuBar。
我要做的一件事是允许在菜单栏上绘制渐变。我设法做到了这一点但是当指定的TActionManager设置为XPStyle时,菜单项出现问题。
使用设置的不同TActionManager样式查看这些图像:
平台默认值(鼠标悬停和按下):
当TActionManager设置为平台默认值时,背景显示正确,您可以看到渐变显示。
但是当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放入类似的面板容器中,然后将渐变绘制到面板上。
与此同时,我会留下这个问题以供进一步的意见和建议。
答案 0 :(得分:2)
还有一个俄罗斯组件也可以进行渐变绘画。我没有测试它,我甚至不知道它是否满足你的要求,但也许你从查看他们的源代码得到一些想法。这是链接(我使用Google翻译将网站翻译成英文): http://translate.google.com/translate?langpair=ru|en&u=http%3A%2F%2Fwww.roschinspb.narod.ru%2Fdevelop.html