私のプログラムでこれまで行ってきたことを形作ると、winformに何かを描画する唯一の方法は、System.Windows.Forms.PaintEventArgsを使用することです。これらの引数またはこの名前空間にアクセスできない場合に、winformにしかアクセスできない場合、winformにどのように描画しますか(四角形のような形)System.Windows.Forms.PaintEventArgs名前空間にアクセスすることなくWinformで描画する方法?
ありがとうございます。
私のプログラムでこれまで行ってきたことを形作ると、winformに何かを描画する唯一の方法は、System.Windows.Forms.PaintEventArgsを使用することです。これらの引数またはこの名前空間にアクセスできない場合に、winformにしかアクセスできない場合、winformにどのように描画しますか(四角形のような形)System.Windows.Forms.PaintEventArgs名前空間にアクセスすることなくWinformで描画する方法?
ありがとうございます。
Paint
イベントの外にフォーム(または他のコントロール)を描画する場合は、そのコントロールにGraphics
オブジェクトを取得する必要があります。その後、あなたの心のコンテンツにペイントすることができます。ただし、次にペイントメッセージが表示されたときに、描画したものは消去される可能性が高いことに注意してください。
using (Graphics g = this.CreateGraphics())
{
// do all your drawing here
}
:
は、フォーム上に描画するには
お客様イベントに登録することにより、にアクセスし、購読したイベントハンドラ内ですべての図面を実行します。これには関連するPaintEventArgs
が添付されます。
PaintEventArgs is a classSystem.Windows.Forms namespaceである。フォームを使って作業している場合は、名前空間とクラスにアクセスできることを意味しますが、描画しようとしているフォームのコードにアクセスすることはできません。
ドンフォームのソースコードにアクセスできません。ペイントイベントはパブリックで、フォーム外のコードからハンドラを登録することができます。 (これはあなたの問題だと思います)
フォームへの参照を持ち、ペイントハンドラに登録してから任意の描画を行うこの簡単なサンプルクラスを参照してください。
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);
}
}
}
このスニペットでは重要な概念では、フォームへの参照を持っている(または任意のコントロールの派生オブジェクト)場合は、(コントロールを再描画する必要があるたびに自動的に呼び出され、ペイントイベントに登録することができるということですそのコントロールに必要なものを描画することができます)。
スニペットでは、コンストラクタでFormを渡してそこにペイントイベントを登録しましたが、これは簡単な例です。あなたのコードの構造は違うでしょうが...あなたはフォームを持っていて、イベントに登録してペインティングを行うメソッドを作成する初期化ステップがあります。
独自のGraphicsオブジェクトを作成して削除することで他の方法で描画することもできますが、これは望ましい方法ではありません。 1つは、ウィンドウを再描画する必要があるときに通知を受け取らず、タイマーなどの再描画のための他のメカニズムを作成する必要があり(非常に単純で醜い例として)、Graphicsオブジェクトを自分で管理する必要があります。