当窗口A显示时,我想显示另一个非模态弹出窗口B,但是:
正如你所看到的,我想要的窗口B就像一个更有用的弹出窗口,就像一个弹出菜单(当你希望它通过点击任何其他部分来逃避时,它不像一般的非模态窗口那么障碍父窗口).
我清楚我的问题了吗?谢谢.
我试图实现古老的德尔福梦想,在任务栏中出现一个无模式的形式.
在任务栏中显示无模式表单的正确方法是什么?
这些是我尝试解决问题的方法.要使其正常运行需要很多东西- 只需在任务栏上显示一个按钮就不是解决方案.让Windows应用程序作为Windows应用程序正常运行应该是我的目标.
对于那些了解我的人,以及我的"展示研究成果"的深度,坚持下去,因为这将是一个疯狂的骑兔子洞.
问题在标题中,以及上面的水平线以上.以下所有内容仅用于说明为什么有些经常重复的建议是不正确的.
最初我有我的"主表格",从中我展示了另一种无模式形式:
procedure TfrmMain.Button2Click(Sender: TObject);
begin
if frmModeless = nil then
Application.CreateForm(TfrmModeless, frmModeless);
frmModeless.Show;
end;
Run Code Online (Sandbox Code Playgroud)
这会正确显示新表单,但任务栏上不会显示任何新按钮:

没有创建任务栏按钮的原因是因为这是设计的.Windows将仅显示"无主"窗口的任务栏按钮.这种无模式Delphi形式绝对拥有.在我的情况下,它由以下所有Application.Handle:

我的项目名称是ModelessFormFail.dpr,Modelessformfail与所有者关联的Windows类名的来源.
幸运的是,有一种方法可以强制 Windows为窗口创建任务栏按钮,即使窗口是拥有的:
WS_EX_APPWINDOWMSDN文档WS_EX_APPWINDOW说:
WS_EX_APPWINDOW
0x00040000L当窗口可见时,强制顶层窗口进入任务栏.
它也是一个众所周知的Delphi技巧,可以覆盖CreateParams并手动添加WS_EX_APPWINDOW样式:
procedure TfrmModeless.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; //force owned window to appear in …Run Code Online (Sandbox Code Playgroud) 我知道Windows Combobox控件不过是一个Textbox和ListBox粘在一起的控件。
我需要在WinForms中模拟相同的东西。我试图弄清楚必须设置以获得适当效果的Windows窗口选项。
到目前为止,我管理的最好的就是创建
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None)this.TopMost = true)this.ShowInTaskbar = false)中未显示的表单这个无边界的最上面的表单包含我的“下拉”控件。当下拉列表失去焦点时,我会“隐藏”我的下拉列表:
this.Deactivate += new EventHandler(TheDropDownForm_Deactivate);
void TheDropDownForm_Deactivate(object sender, EventArgs e)
{
...
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
这种混乱的局面效果很好。

...除了“下拉菜单”使焦点从所有者表单移开。
这是我的问题,我的弹出窗口应具有哪些属性?
但是,当我失去下拉菜单时(如何无法失去焦点),我该如何隐藏它呢?
如何在.NET中模拟组合框下拉菜单?
注意:请勿将示例屏幕快照中看到的内容与其他内容混淆。我问如何在Winforms中创建“下拉”表单-内容可能与上面的屏幕截图不同:

delphi ×2
c# ×1
delphi-xe6 ×1
popup ×1
winapi ×1
windows ×1
windows-7 ×1
windows-95 ×1
winforms ×1