2

私は Java のバックグラウンドを持っており、言語を学ぶために C# に書いた Conway のライフ ゲームの単純なバージョンを移植しようとしています。

Java では、JComponent から継承し、paint() をオーバーライドして出力を描画しました。私の新しいキャンバス クラスには、読み取り/操作が可能なシミュレーションのバックエンドのインスタンスがありました。次に、WYSIWYG GUI エディタ (NetBeans の Matisse) を入手して、キャンバスを視覚的に配置できるようにしました。

C# では、何かを描画するために OnPaint() をオーバーライドする必要があることを収集しました。これには (私の知る限り) 何かから継承する必要があります (私は Panel を選択しました)。Windows フォーム エディターでカスタム クラスを配置する方法がわかりません。また、生成されたコードのどこにクラスを配置する必要があるかもわかりません。

どうすればこれを行うことができますか?すべての描画コードをサブクラスに入れるのは本当にどうすればよいですか? Google で簡単な答えが見つからないということは、ここで何か重要なことを見逃していることを示唆しています。誰かが WPF でもこれを行う方法を提案したい場合は、聞いてみたいです。

ありがとう

4

1 に答える 1

2

Windows フォームでは、コントロールのメソッドを呼び出すだけで、任意のコントロールを簡単に描画できますCreateGraphics。たとえば、パネルがある場合は、次のように描画できます。

using (var g = panel1.CreateGraphics()) {
    g.DrawString("Hello World", 0, 0);
}

コントロールにもPaintイベントがあります。プロパティ ウィンドウでイベントをダブルクリックしてイベント ハンドラーを追加すると、次のように描画できます。

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    e.Graphics.DrawString("Hello World", 0, 0);
}

コントロールから派生させたい場合は、コードで行うか、新しいユーザー コントロールを作成して、コードと .Designer.cs ファイルで基本クラスを変更します (ただし、UserControlまたは単にControl問題ありません)。デザイナーに既にフォームがある場合、それは既に から派生しておりForm、OnPaint をオーバーライドすることができます。

私のアドバイスは次のとおりです。何かを描きたいだけなら、通常、新しいクラスを作成する必要はありません。Paint イベントを使用するだけです。すぐに再描画する必要がある場合は、Refresh を呼び出して、コントロール自体を再描画させます。これでうまくいくはずです。ちらつきを避けるのに役立つ保護された DoubleBuffered プロパティもあることに注意してください (フォームまたは派生コントロールに設定します)。

WPFで何をするかわかりません。レイアウトとレンダリング エンジンは非常に強力であり、データ テンプレートやコントロール テンプレートなどを使用するだけで済むため、WPF で実際に手動で何かを描画する必要はありませんでした。WPF のポイントは、通常は何も描画しないことです。エンジンはあなたのために描きます。

于 2010-04-29T16:16:53.993 に答える