gpt4 book ai didi

delphi - TActionMainMenuBar 渐变绘画

转载 作者:行者123 更新时间:2023-12-03 15:57:06 32 4
gpt4 key购买 nike

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

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

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

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

enter image description here enter image description here

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

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

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

enter image description here enter image description here

如您所见,外观不太好。

我已经在“画图”中编辑了图像,以粗略地了解我希望它的外观:

鼠标悬停并选择

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

与此同时,我将保留这个问题以供进一步的评论和建议。

最佳答案

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

关于delphi - TActionMainMenuBar 渐变绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12017787/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com