gpt4 book ai didi

delphi - 即使在 Items.clear 之后,TPopupMenu 仍保留最大宽度

转载 作者:行者123 更新时间:2023-12-03 14:37:07 29 4
gpt4 key购买 nike

如何重置 PopupMenu 项目列表的最大宽度?

假设您在运行时将一些 TMenuItems 添加到弹出菜单中:

item1: [xxxxxxxxxxxxxxxxxxx]
item2: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]

菜单会自动调整大小以适合最大的项目。但是然后你执行 Items.Clear 并添加一个新项目:

item1: [xxxxxxxxxxxx                    ]

最终结果就是这样,标题后面有一个很大的空白。

除了重新创建弹出菜单之外还有其他解决方法吗?

这里是重现此异常的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
t: TMenuItem;
begin
t := TMenuItem.Create(PopupMenu1);
t.Caption := 'largelargelargelargelargelarge';
PopupMenu1.Items.Add(t);
PopupMenu1.Popup(200, 200);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
t: TMenuItem;
begin
PopupMenu1.Items.Clear;
t := TMenuItem.Create(PopupMenu1);
t.Caption := 'short';
PopupMenu1.Items.Add(t);
PopupMenu1.Popup(200, 200);
end;

最佳答案

tl,dr:附加图像列表。

<小时/>

如果菜单项可以发送 WM_MEASUREITEM 消息,则宽度将被重新计算。

OwnerDraw 属性设置为 True 即可实现此目的,这是第一个解决方案。但对于较旧的 Delphi 版本,这将导致菜单项的非默认和非样式绘制。这是不可取的。

幸运的是,TMenu 有一种非凡的方式来判断菜单(项目)是否是所有者绘制的:

function TMenu.IsOwnerDraw: Boolean;
begin
Result := OwnerDraw or (Images <> nil);
end;

因此,将 Images 属性设置为现有的 ImageList 将实现相同的效果。请注意,ImageList 中不需要有图像。如果其中有图像,则不必使用它们,并让菜单项的 ImageIndex-1 。当然,带有图像的 ImageList 也可以。

关于delphi - 即使在 Items.clear 之后,TPopupMenu 仍保留最大宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26435797/

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