2014-07-27 61 views
1

我試圖使一個窗體是一個MDI容器,當我按下數字鍵盤(1-9)上的按鈕時,一個小窗體(這將是表單的MDI子元素)將出現在數字在數字鍵盤位置的相對位置(5在中間,9在右上角),然後我想程序的焦點返回到mdi容器,所以你可以再次按下按鈕。顯示一個mdi孩子後,將焦點設置到一個mdi容器

我在MDI容器中的按鍵事件設置是這樣的:

private void MdiClient_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      int num; 
      if (e.KeyChar >= '1' && e.KeyChar <= '9') 
      { 
       num = e.KeyChar - '0'; 
       PhysicalChild pc = new PhysicalChild(); 
       pc.MdiParent = this; 
       pc.Show(); 
       pc.Location = new Point(num % 3 * Width/2 - 50 * num, num/3 * Height/2 - 50 * num); 
       pc.Size = new Size(50, 50); 
       Focus(); 
      } 
     } 

問題是,它並沒有將焦點返回到MDI容器,甚至沒有,如果我點擊在容器上的鼠標地區,我不得不關閉MDI的孩子,因爲它接受更多的按鈕。

我在做什麼錯,我該如何解決?

謝謝。

+0

@AnnL。忘記第二個問題,原來我的公式是錯誤的,但第一個問題呢? – shoham

回答

1

從我讀過的,有MDI子窗體的時候,他們總是會有焦點。當沒有可以保持焦點的子表單時,MDI父級只獲得焦點。

但是,從我讀過的有關子窗口的here中,可以將子窗口上的父窗口屬性更改爲Null。這將使孩子與父母分離......這應該使您的MDI窗口再次無孩子。 (免責聲明:我沒有真正嘗試過,因此我不知道它是否能解決您的問題。)

如果這樣不起作用,MDI窗口可能不是您的應用程序的最佳解決方案。 MDI窗口通常是空的容器,除了菜單:他們不傾向於擁有自己的內容。

+0

哦......但我仍然可以爲會影響父母的孩子製作活動。 – shoham

+0

是的:父母只需要訂閱孩子的事件(使用事件處理程序處理它)。 –

0

你的代碼是完美的,焦點返回到mdiParent。 問題出在您的孩子負載上,嘗試清空它,然後再次嘗試您的代碼,它像魅力一樣工作。 我測試過了。

你的代碼必須是這樣的:

public partial class PhysicalChild : Form 
    { 
     public PhysicalChild() 
     { 
      InitializeComponent(); 
     } 

     private void PhysicalChild_Load(object sender, EventArgs e) 
     { 
      MessageBox.Show(this.MdiParent.Text); 
     } 
    } 
+0

我添加一個像這樣的PhysicalChild:'public PhysicalChild(Form1 parentForm){MdiParent = parentForm;顯示(); }'。這裏有什麼問題? – shoham

+0

嘗試在構造函數中評論你的行,因爲你不需要它們來顯示錶單,但是當你調用方法pc.Show();它調用Form(pc)LoadEvent並且你可以放置其他代碼。 Form1的parentForm是redound,因爲您在(Child.Form類的this.ParentForm屬性)中有父窗體。 – Microlang

+0

看看我的簡單編輯答案 – Microlang

相關問題