2010-12-03 57 views
1

私を導いて助けてください。MDI親フォームのラベルは、子フォームのバックグラウンドに残っていませんか?

私は中央にラベルを付けたMDI親フォームを持っています(中央にアプリケーション名を表示するため)。このMDI親のフォームを開くと、このラベルは新しく開いたフォームの背面に表示されますが、子フォームを表示すると、新しく開いたフォームの前にラベルが表示されます(ラベルとMDI親の間に新しく開いたフォームが表示されます)。

それを管理する方法を教えてください。

おかげ

答えて

3
public partial class MyMdiForm : Form 
{ 
    public MyMdiForm() 
    { 
     InitializeComponent(); 
     foreach (Control control in Controls) 
     { 
      if (control is MdiClient) 
       control.Paint += mdiBackgroundPaint; 
     } 
    } 

    private void mdiBackgroundPaint(object sender, PaintEventArgs e) 
    { 
     var mdi = sender as MdiClient; 
     if (mdi == null) return; 

     e.Graphics.Clip = new System.Drawing.Region(mdi.ClientRectangle); 
     e.Graphics.DrawString("*** YOUR NAME HERE ***",this.Font,Brushes.Red,100F,100F); 
    } 
} 
+0

Jvanrhynさん、ありがとうございました。ちょうど1つの質問pelase。私の問題は正常でしたか?私は、彼らがコントロールを持っている場合、コントロールが子フォームに来るようにMDIフォームのこの正しい働きがあると言っていますか?それとも私のコードで何か問題があったのですか?夜遊びと貴重な時間のおかげです。 – haansi

+0

はい、これは正常です。 MDIコンテナは、フォーム用のホストであり、実際にはコントロール用ではありません。ただし、ツールバーやステータスバーなどをMDIフォームの上部、下部、側面にドッキングすることは例外です。 – jvanrhyn

+0

条件付きコンパイルシンボルのリストをバックグラウンドで表示するのに最適です。 :) – Samuel

4

あなたがアクティブなMDI子供ENは再びそれを示し一度アクティブな子はもうありません持っていながら、これは、ラベルを非表示になります。

private void Form1_MdiChildActivate(object sender, EventArgs e) 
    { 
     if (ActiveMdiChild != null) 
      label1.SendToBack(); 
     else 
      label1.BringToFront(); 
    } 

私はこのことができます願っています。

+0

返信のためにjvanrhynさんに感謝します。どのような形で私はこれをコード化するのですか?もう1つの事を案内してください。これは正しい動作か、それとも私には間違ったものです。ありがとう – haansi

+2

これは、MDIフォームのMdiChildActivateイベントです。このイベントは、子がアクティブ化され、非アクティブ化されたときに起動されます。 – jvanrhyn

+0

jvanrhyn私はこのコードを試しました。それは部分的に問題を解決した。バックフォーム(mdi parent)の子フォームラベルを読み込むと、目に見えなくなり、子フォームのlableを閉じると戻る。しかし、それはまた、ラベルの行くと来るような奇妙な外観を与える。なぜそこにとどまっているかもしれないいくつかの子供のフォームの背面に表示されたままにすることはできませんし、子フォームが開いているlableは、最初の層になります。子フォームを閉じると、子フォームが来るときにラベルが消えてしまいます。ご意見をお聞かせください。ありがとう – haansi

2

問題は、ラベルがMdiClient(灰色のMdiコンテナ)ではなくフォームに追加されていることです。

残念ながら、AFAIKでは、MdiClientにコントロールを追加することはできません。

この記事で示唆したように唯一の方法は、あなたがMDICLIENTのPaintイベントに欲しいものを描いている。

http://www.vbaccelerator.com/home/NET/Code/Libraries/Windows/MDI_Client_Area_Painting/article.asp

+0

dibEmALLに返信してくれてありがとう、実際には私はwinformsを初めて使用しています。私がMdiの親に追加したラベル(シンプルなフォームを追加し、別のフォームのMDIParentにして、別のMDI親タイプのフォームを追加しなかった)。開いていないと、新しいフォームラベルがMDIの親に表示されます。 – haansi

0

まあ、明らかに何かがあなたのMDI親のZオーダーが間違っていますウィンドウの子コントロール。 (親の子コントロールには、ラベルとMDIドキュメントウィンドウが含まれています)

あなたのコードは表示されていないため、特定のソリューションを投稿することはできません。おそらく、SendToBack methodに見て:あなたは、呼び出し試みることができる:

yourBackgroundLabel.SendToBack(); 

新しいMDI(子/ドキュメント)ウィンドウを開き

+0

ありがとうStakx、これは正しく動作しているか、コードに問題がありますか?私は多くのコードをactullyしていない。私はちょうどフォームmdiの親を作成し、それに別のフォームをロードしました。親は中央にlableを持っています。メニューから私はちょうど新しい形を示しています。ご参考までに – haansi

+0

@haansi、私はあなたのコードがそれを見ることなくいくつかの問題があるかどうかはわかりません。 (しかし、明らかに、あなたのコードは間違っています、あなたのプログラムが期待どおりに動作しないためです)同じ理由で、あなたのコードを知らないので、私の解決策があなたのケースで役立つかどうかはわかりません。なぜそれを試してみてください! – stakx

関連する問題