如何在WinForms中制作我称之为“弹出窗口”的东西?
既然我使用了自己编造的词语“popup”,那么让我举些所谓的“popup”窗口的例子:
一个工具提示窗口(可以超出其父窗体的边界,不会出现在任务栏中,不是模态的,也不会夺取焦点):
一个弹出菜单窗口(可以超出其父窗体的边界,不会出现在任务栏中,不是模态的,也不会夺取焦点):
一个下拉窗口(可以超出其父窗体的边界,不会出现在任务栏中,不是模态的,也不会夺取焦点):
一个主菜单窗口(可以超出其父窗体的边界,不会出现在任务栏中,不是模态的,也不会夺取焦点):
更新一个弹出窗口,当使用鼠标或键盘进行交互时不会使其成为"活动"窗口("所有者"窗口仍然是活动窗口):
- 可以超出其父窗体的边界(即不是子窗口)
- 不会出现在任务栏中(即Windows确定哪些窗口应该出现的启发式方法不起作用,也没有WS_EX_APPWINDOW扩展窗口样式)
- 不是模态的(即不会禁用其“所有者”)
- 不会窃取焦点
- 始终位于其“所有者”的顶部
- 与之交互时不会成为“活动”窗口(所有者仍然处于活动状态)
- 如何在本地代码中实现以上所有内容?
- 如何在Delphi中创建弹出窗口?
- 我有这个本地代码来显示一个“弹出”窗口 - 需要哪些P / Invokes才能在.NET中执行相同的操作?
- 我在.NET中有一组P / Invoke - 我可以重用常规的WinForm,覆盖某些方法,以达到相同的效果吗?
- 我有一个WinForm,通过覆盖某些方法显示为“弹出” - 是否有内置的
Control
可以作为我的弹出窗口? - 如何在WinForms中模拟下拉窗口?
尝试#1
我尝试了Show(onwer) + ShowWithoutActivation
方法:
PopupForm dd = new PopupForm ();
dd.Show(this);
使用PopupForm:
public class PopupForm: Form
{
public PopupForm()
{
InitilizeComponent();
}
private void InitilizeComponent()
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = FormWindowState.Normal;
this.ShowInTaskbar = false;
}
protected override bool ShowWithoutActivation
{ get { return true; } }
}
几乎解决了问题,但是我被提醒了“弹出”窗口的另一个属性:当使用鼠标或键盘与其交互时,它们不会从其“所有者”表单中获得焦点。