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

标签 delphi winapi popup

当显示窗口 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/

相关文章:

winapi - x86 程序集 (masm32) - 我可以在 Windows XP 上使用 int 21h 来打印内容吗?

delphi - 如何有效地等待文件解锁?

javascript - 如何从html弹出窗口返回值

c# - 如何使用 Windows shell 获取文件扩展名的大图标?

cocoa - 在 Cocoa 中创建信息弹出窗口/工具提示

wpf - 如何: Create reminders that should trigger an event to be handled in a Windows application?

rest - Delphi - 如何创建通用 REST 调用

delphi - 检查 Advantage 数据库连接的运行状况

java - 我在哪里可以找到 "reference barcodes"来验证条码库输出?

delphi - 从 DNS 获取 IP 地址而不使用 GetHostByName