プログラムでこれまでに行ったことをフォーム化すると、winformに何かを描画する唯一の方法はSystem.Windows.Forms.PaintEventArgsを使用することだと思われます。これらの引数またはこの名前空間にアクセスできず、winformにしかアクセスできない場合は、winformにどのように描画しますか(たとえば、長方形のような形状)。
前もって感謝します。
プログラムでこれまでに行ったことをフォーム化すると、winformに何かを描画する唯一の方法はSystem.Windows.Forms.PaintEventArgsを使用することだと思われます。これらの引数またはこの名前空間にアクセスできず、winformにしかアクセスできない場合は、winformにどのように描画しますか(たとえば、長方形のような形状)。
前もって感謝します。
PaintEventArgsは、System.Windows.Forms名前空間のクラスです。フォームを使用している場合は、名前空間とクラスにアクセスできることを意味しますが、描画しようとしているフォームのコードにはアクセスできない場合があります...
フォームのソースコードにアクセスできない場合でも、Paintイベントは公開されており、フォームの外部のコードからハンドラーを登録できます。(これがあなたの問題だと思います。)
フォームへの参照があり、ペイントハンドラーに登録してから、任意の描画を行うこの単純なサンプルクラスを参照してください。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
class Painter {
public Painter(Form form) {
form.Paint += new PaintEventHandler(form_Paint);
}
void form_Paint(object sender, PaintEventArgs e) {
e.Graphics.DrawLine(Pens.Black, 0, 0, 20, 20);
}
}
}
このスニペットの重要な概念は、フォーム(またはコントロールから派生したオブジェクト)への参照がある場合、コントロールを再ペイントする必要があるときに自動的に呼び出されるペイントイベントに登録できることです(そして、必要なものを描画できます)そのコントロールで。)
スニペットでは、コンストラクターでフォームを渡し、そこでペイントイベントに登録しましたが、これは簡単な例です。コードの構造は異なりますが...フォームがあり、イベントに登録してからペイントを行うメソッドを作成する初期化ステップがあります。
独自のGraphicsオブジェクトを作成して破棄することで他の方法を描くこともできますが、これは推奨される方法ではありません。1つは、ウィンドウを再描画する必要があるときに通知を受け取らず、タイマーなどの再描画のための他のメカニズムを作成する必要があり(非常に単純で醜い例として)、Graphicsオブジェクトを自分で管理する必要があります。
イベントの外部でフォーム(またはその他のコントロール)を描画する場合は、そのコントロールのオブジェクトPaint
を取得する必要があります。Graphics
次に、心ゆくまでペイントできます。ただし、次にペイントメッセージが表示されたときに、描画したものが消去される可能性があることに注意してください。
フォームに描画するには:
using (Graphics g = this.CreateGraphics())
{
// do all your drawing here
}
イベントにサブスクライブすることでそれらにアクセスでき、サブスクライブしたイベントハンドラーControl.Paint
内ですべての描画を実行します。これは、関連するで提供されますPaintEventArgs
。