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

前端之家收集整理的这篇文章主要介绍了delphi – 如何显示一个像弹出菜单一样的窗口?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当窗口A显示时,我想显示另一个非模态弹出窗口B,但是:

>由于窗口B成为前窗,我不希望窗口A变为非活动状态;@H_404_3@>我希望当窗口B聚焦时,我只需单击一下就可以在窗口A上拉下一个组合框控件(通常你需要点击两次,一个用于将焦点移动到窗口A,第二个用于拉下组合框);

正如你所看到的,我想要的窗口B就像一个更有用的弹出窗口,就像一个弹出菜单(当你希望它通过点击任何其他部分来逃避时,它不像一般的非模态窗口那么障碍父窗口).

我清楚我的问题了吗?@H_404_3@谢谢.

解决方法

我发现“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相关文章