我想要关闭一个System.Windows.Forms.Form,如果用户点击它外面的任何地方。我试过使用IMessageFilter,但即使这样,没有任何消息传递给PreFilterMessage。如何在窗体窗口外接收点击?用户在窗体窗口外单击时如何关闭窗体?
回答
随着this question感谢p-daddy,我发现这个解决方案,它允许我使用ShowDialog的:
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
this.Capture = true;
}
protected override void OnCaptureChanged(EventArgs e)
{
if (!this.Capture)
{
if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))
{
this.Close();
}
else
{
this.Capture = true;
}
}
base.OnCaptureChanged(e);
}
如果是在MDI应用程序子窗体,你可以捕获点击父窗体,否则该解决方案将是混乱。
我不相信你有什么建议表示无论如何直观的UI行为。你确定这是最好的设计吗?
在表单的停用事件中,放入“this.Close()”。只要您点击Windows中的其他任何位置,您的表单就会关闭。
更新:我认为你现在有一个音量按钮,并在Click事件中创建了一个VolumeSlider表单的实例,并通过调用ShowDialog()使其显示,直到用户关闭弹出窗口形成。在下一行中,您阅读用户选择的音量并将其用于您的程序中。
这是OK,但你已经注意到它迫使用户明确地关闭弹出窗口,以回到主程序。 Show()是你真正想在弹出窗体中使用的方法,但Show()不会阻止这意味着主窗体上的Click事件结束,而不知道新卷应该是什么。
一个简单的解决方案是你的主要形式是这样上创建一个公共方法:
public void SetVolume(int volume)
{
// do something with the volume - whatever you did before with it
}
然后,在你的音量按钮的Click事件(也主要形式),你让VolumeSlider看起来像这样:
VolumeSlider slider = new VolumeSlider();
slider.Show(this); // the "this" is needed for the next step
在VolumeSlider形式,为用户的工作(我猜)滚动条,你把滚动条的ValueChanged事件代码(我认为这是它是什么):
MainForm owner = (MainForm)this.Owner;
owner.SetVolume(scrollbar.Value);
然后在VolumeSlider窗体的停用事件你会把this.Close()如上所述。您的表格将按照预期行事。
不幸的是,这不适用于ShowDialog() – Simon 2008-11-18 15:29:42
我:“医生,当我这样做的时候会感到痛苦。”医生:“不要那样做。”一秒钟见上面的更新。 – MusiGenesis 2008-11-18 16:06:51
让我知道它是否适合你。我讨厌在同一时间出现sn and和错误。 :) – MusiGenesis 2008-11-18 17:53:18
如果您试图制作一个弹出式窗口,其行为有点像菜单,但它可以让您与控件进行交互,您可以尝试在tooltrip下拉菜单中托管一个usercontrol。
与西蒙的解决方案,我不得不由诺姆describt同样的问题。以下代码避免了“点击”问题......
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
// if click outside dialog -> Close Dlg
if (m.Msg == NativeConstants.WM_NCACTIVATE) //0x86
{
if (this.Visible)
{
if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))
this.Close();
}
}
}
SIMPLY WAY: 在Form1上使用此代码来调用窗口2:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Form2.Owner = Me
Form2.Show()
End Sub
,然后再使用此代码在Form1:
Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
If Form2.IsHandleCreated = True Then
Form2.Close()
End If
End Sub
很简单:
private void button1_Click(object sender, EventArgs e)
{
Form f = new Form();
f.LostFocus +=new EventHandler(f_LostFocus);
f.Show();
}
void f_LostFocus(object sender, EventArgs e)
{
Form f = sender as Form;
f.Close();
f.Dispose();
}
- 1. 在窗口关闭时运行窗体窗体线程
- 2. 如何关闭窗体后关闭控制台窗口
- 3. 如何避免在JQgrid中编辑或添加新行时单击外部模态窗口时关闭窗体?
- 4. 子窗体关闭时父窗体关闭
- 5. 从子窗体关闭父窗体
- 6. 如果用户点击“X”按钮,从子窗体关闭父窗体
- 7. 如何在javascript中关闭\隐藏弹出窗体窗口?
- 8. 如何在窗体上打开新窗口关闭?
- 9. 在javascript中关闭父窗口时如何关闭子窗口?
- 10. Windows窗体模式窗体在基本窗体不活动时立即关闭
- 11. 如何在子窗口关闭时提交父窗口表单
- 12. VB.NET - 在窗体外单击隐藏窗体
- 13. 在弹出窗体关闭时刷新子窗体
- 14. monomac - 如何在单击主窗口中的按钮时关闭子窗口
- 15. 如何关闭窗体窗体并将控件转移到其他窗体?
- 16. 关闭对话框窗体关闭父窗体
- 17. 用锌关闭窗体
- 18. 无关闭窗口的关闭窗口
- 19. 如何关闭当前窗体并返回主窗体
- 20. 如何从Windows Forms 2.0中的子窗体关闭父窗体?
- 21. vC++窗体窗口
- 22. 子窗口关闭时通知窗口
- 23. 哪个窗口字体显示窗口关闭按钮?
- 24. 关闭时将变量从窗体传递到其他窗体
- 25. 关闭子窗体时从父窗体更改LayoutMdi
- 26. 用户窗体上的其他用户窗体控件的设置值关闭
- 27. 如何在PowerShell中关闭Windows窗体?
- 28. 从winforms应用程序的子窗体中关闭主窗口
- 29. 当父窗口在Jquery中关闭时关闭子窗口
- 30. 父窗口用户注销时关闭特定的子窗口
这是一个音量滑块 - 这似乎是w其他人都已经实施了他们。 – Simon 2008-11-18 11:34:20
这与下拉框没有太大区别 - 只要您点击其他地方,选择列表就会消失。 – MusiGenesis 2008-11-18 11:38:12