我想要關閉一個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