2016-06-22 4 views
1

グループボックスに円を描画しようとしていますが、テキストボックスの入力が変更されたときに瞬時に円のサイズが変更されます。c#windowsの同心円を描画するアプリケーション

private void groupBox1_Paint(object sender, PaintEventArgs e) 
{ 
    //CIRCLE 
    Graphics graphics = e.Graphics; 
    Pen p = new Pen(Color.Black, 1); 
    float S = float.Parse(textBox1.Text); 
    Rectangle r = new Rectangle(50, 50, (int)S, (int)S); 
    graphics.DrawEllipse(p, r); 
    graphics.Dispose(); 
} 
private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    groupBox1.Paint += new PaintEventHandler(this.groupBox1_Paint); 
    this.Controls.Add(groupBox1); 
} 
+1

グラフィックを破棄しないでください(グラフィックスを自分で作成した場合を除きます)。また、フォームのコンストラクタに 'Paint'のイベントハンドラを追加すると、複数のハンドラを重複して追加することになります。 –

答えて

2

Paintメソッドを直接呼び出すことはありません。代わりに、通常、WindowsはgroupBox1.Invalidate();を呼び出すことによって、いつ再描画するかを決定します。

コントロールが隠れているか、あまりに多くのペイント要求が保留されている可能性があります。そうすれば、Windowsはそれらのいくつかを削除する可能性があります。

this.Controls.Add(groupBox1);でコントロールを再追加しないでください!

は、イベントハンドラを再購読しません。コンストラクタで(+=)一度登録するか、プロパティウィンドウをイベント(Flashシンボルをクリック)に切り替えてから、フォームデザイナから行い、ペイントイベントをダブルクリックします。

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    groupBox1.Invalidate(); 
} 

groupBox1.Refresh();を呼び出し、その後、リフレッシュは本当に非常に即時でなければなりません(ただし、アニメーションを行っている場合、それはおそらく唯一のケースだ)した場合。

参照:Whats the difference between Control.Invalidate, Control.Update and Control.Refresh?


イベントは次のように動作します:イベントが上昇したときに何かをやりたいと思った方法は、(!一度だけ)イベントをサブスクライブ+=と。これはコードで手動で行うことも、フォームデザイナで(より簡単に)行うこともできます。それから、何らかの論理がイベントを起こします。この場合、ロジックはInvalidateメソッドで非表示になります。イベントを購読したすべてのメソッドが実行されます。

参照:How to: Raise and Consume Events
C#イベントのグーグルでは、多くのチュートリアルや例が見つかります。

+1

彼はペイントのイベントハンドラを追加してペイント(無効化)を呼び出すのを混乱させます。しかし、毎回ではなく、 'Paint'イベントのコードを(コンストラクタで)一度追加する必要があります。 –

+0

'GroupBox'は' Paint'イベントを持っていますか?私はドキュメントに1つも見ません。 – adv12

+0

すべてのコントロールとフォーム自体は、[System.Windows.Forms.Control](https://msdn.microsoft.com/en-us/library/system.windows.forms.control%)から直接的または間接的に派生しています28v = vs.110%29.aspx?f = 255&MSPPError = -2147217396)、これは 'Paint'イベント(およびコントロールの他のメンバーのほとんど)を定義します。 –