delphi – 如何显示一个像弹出菜单一样的窗口?
发布时间:2020-12-15 10:07:46 所属栏目:大数据 来源:网络整理
导读:当窗口A显示时,我想显示另一个非模态弹出窗口B,但是: 由于窗口B成为前窗,我不希望窗口A变为非活动状态; 我希望当窗口B聚焦时,我只需单击一下就可以在窗口A上拉下一个组合框控件(通常你需要点击两次,一个用于将焦点移动到窗口A,第二个用于拉下组合框); 正如
当窗口A显示时,我想显示另一个非模态弹出窗口B,但是:
>由于窗口B成为前窗,我不希望窗口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,我同意loursonwinny和Ulrich.IMO弹出形式似乎比较复杂.虽然在SpTBXFormPopupMenu的情况下你必须安装两个库,TB2K和SpTBXLib.至少浏览源可能暗示可能涉及的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |