加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:07:46 所属栏目:大数据 来源:网络整理
导读:当窗口A显示时,我想显示另一个非模态弹出窗口B,但是: 由于窗口B成为前窗,我不希望窗口A变为非活动状态; 我希望当窗口B聚焦时,我只需单击一下就可以在窗口A上拉下一个组合框控件(通常你需要点击两次,一个用于将焦点移动到窗口A,第二个用于拉下组合框); 正如
当窗口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.至少浏览源可能暗示可能涉及的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读