2008-11-18 186 views

回答

4

隨着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); 
} 
0

如果是在MDI應用程序子窗體,你可以捕獲點擊父窗體,否則該解決方案將是混亂。

我不相信你有什麼建議表示無論如何直觀的UI行爲。你確定這是最好的設計嗎?

+0

這是一個音量滑塊 - 這似乎是w其他人都已經實施了他們。 – Simon 2008-11-18 11:34:20

+0

這與下拉框沒有太大區別 - 只要您點擊其他地方,選擇列表就會消失。 – MusiGenesis 2008-11-18 11:38:12

7

在表單的停用事件中,放入「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()如上所述。您的表格將按照預期行事。

+0

不幸的是,這不適用於ShowDialog() – Simon 2008-11-18 15:29:42

+0

我:「醫生,當我這樣做的時候會感到痛苦。」醫生:「不要那樣做。」一秒鐘見上面的更新。 – MusiGenesis 2008-11-18 16:06:51

+0

讓我知道它是否適合你。我討厭在同一時間出現sn and和錯誤。 :) – MusiGenesis 2008-11-18 17:53:18

0

如果您試圖製作一個彈出式窗口,其行爲有點像菜單,但它可以讓您與控件進行交互,您可以嘗試在tooltrip下拉菜單中託管一個usercontrol。

4

與西蒙的解決方案,我不得不由諾姆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(); 
     } 
    } 
} 
0

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 
-1

很簡單:

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(); 
    } 
相關問題