当窗口A显示时,我想显示另一个非模态弹出窗口B,但是:
>由于窗口B成为前窗,我不希望窗口A变为非活动状态;
>我希望当窗口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,我同意loursonwinny和Ulrich.IMO弹出形式似乎比较复杂.虽然在SpTBXFormPopupMenu的情况下你必须安装两个库,TB2K和SpTBXLib.至少浏览源可能暗示可能涉及的内容.