gpt4 book ai didi

delphi - 如何显示一个像弹出菜单一样的窗口?

转载 作者:行者123 更新时间:2023-12-03 14:43:44 24 4
gpt4 key购买 nike

当显示窗口 A 时,我想显示另一个非模态弹出窗口 B,但是:

  1. 我不希望窗口 A 由于窗口 B 成为前窗口而变得不活动;
  2. 我希望当窗口 B 获得焦点时,我可以一键下拉窗口 A 上的组合框控件(通常您必须单击两次,一次将焦点移动到窗口 A,第二次将下拉组合框) );

正如你所看到的,我想要的窗口 B 类似于一个更可用的弹出窗口,如弹出菜单(当你希望它通过单击任何按钮来离开时,它比一般的非模态窗口更不成为障碍)父窗口的其他部分)。

我的问题清楚吗?谢谢。

最佳答案

我为“1”找到的最简单的解决方案是,一旦弹出表单被激活(在 WM_ACTIVATE 处理程序中),就将 WM_NCACTIVATE 发送到调用表单,以便调用表单将使用事件的标题绘制其标题颜色。您必须在弹出表单中拥有调用表单的引用才能实现此目的。

对于“2”,您可以在同一 WM_ACTIVATE 处理程序中释放弹出表单,这不会消耗进入调用表单的点击。

所以……像这样应该进入弹出表单;

type
TForm2 = class(TForm)
[..]
private
FOwner: TForm;
procedure WmActivate(var Msg: TWMActivate); message WM_ACTIVATE;
public
constructor Create(AOwner: TComponent); override;

[...]
constructor TForm2.Create(AOwner: TComponent);
begin
if not (AOwner is TForm) then
raise Exception.Create('Owner should be TForm');
FOwner := TForm(AOwner);
inherited;
end;

procedure TForm2.WmActivate(var Msg: TWMActivate);
begin
SendMessage(FOwner.Handle, WM_NCACTIVATE, Ord(Msg.Active <> WA_INACTIVE), 0);
inherited;
if Msg.Active = WA_INACTIVE then
Release;
end;

并提供调用表单作为弹出表单的所有者;

procedure TForm1.Button1Click(Sender: TObject);
var
PopForm: TForm2;
begin
PopForm := TForm2.Create(Self);
[..]

<小时/>FWIW,我都同意 loursonwinnyUlrich 。 IMO 弹出表单比看起来更复杂。尽管在 SpTBXFormPopupMenu 的情况下,您必须安装两个库: TB2KSpTBXLib 。至少浏览来源可以暗示可能涉及的内容。

关于delphi - 如何显示一个像弹出菜单一样的窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2178494/

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