相关疑难解决方法(0)

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

当窗口A显示时,我想显示另一个非模态弹出窗口B,但是:

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

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

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

delphi winapi popup

9
推荐指数
2
解决办法
9542
查看次数

如何正确使用无模式窗体出现在任务栏中

我试图实现古老的德尔福梦想,在任务栏中出现一个无模式的形式.

在任务栏中显示无模式表单的正确方法是什么?


研究工作

这些是我尝试解决问题的方法.要使其正常运行需要很多东西- 只需在任务栏上显示一个按钮就不是解决方案.让Windows应用程序作为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_APPWINDOW

MSDN文档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 delphi windows-7 windows-95 delphi-xe6

8
推荐指数
1
解决办法
2254
查看次数

如何在WinForms中模拟一个下拉窗口?

我知道Windows Combobox控件不过是一个TextboxListBox粘在一起的控件。

我需要在WinForms中模拟相同的东西。我试图弄清楚必须设置以获得适当效果的Windows窗口选项。

  • 该下拉列表不能是子窗口 -否则它将被剪切到父窗口区域
  • 从概念上讲,它必须是一个弹出窗口 -一个重叠的窗口
  • 它可以是一个拥有的窗口 -拥有的窗口在z顺序中始终位于其所有者的上方。当其所有者被销毁时,系统会自动销毁拥有的窗口。当拥有者的窗口最小化时,将隐藏拥有的窗口。

到目前为止,我管理的最好的就是创建

  • 无边距(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中创建“下拉”表单-内容可能与上面的屏幕截图不同:

在此处输入图片说明

c# winforms drop-down-menu

5
推荐指数
1
解决办法
3190
查看次数