大きな円を「周回」する小さな円を示す「PictureBox」を開発しようとしています。重要な側面は、この小さな円の位置 (したがって全体像) が、私が毎秒行うやや高価なハードウェア呼び出しに基づいて変化する可能性があることです。説明のために「AngleValueTextBox」呼び出しを代用しています。
このトピックに関するいくつかの記事を調べたところ、これが適切な方法のようです。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AngleValueTextBox_TextChanged(null, null); // Why doesn't this make the box appear on program start?
PictureBox.Invalidate(); // Or this?
}
public class CircleCenterClass { public double X; public double Y;
public CircleCenterClass(double X, double Y) { this.X = X; this.Y = Y; }
}
CircleCenterClass GetCenterOfOrbitCircle(CircleCenterClass OrbitCenter, double OrbitRadius, double Angle)
{
CircleCenterClass Result = new CircleCenterClass(0, 0);
Result.X = OrbitCenter.X + OrbitRadius * Math.Sin(Angle * (3.141592654 / 180));
Result.Y = OrbitCenter.Y - OrbitRadius * Math.Cos(Angle * (3.141592654 / 180));
return Result;
}
private void drawPictureBox(Graphics graphics, bool ownGraphics)
{
double Angle= 0;
// Normally this is an expensive hardware call which I don't want to make more than
// once a second.
try {
Double.TryParse(AngleValueTextBox.Text, out Angle);
} catch (Exception e) {
MessageBox.Show("Could not parse Angle " +
AngleValueTextBox.Text);
}
using (Bitmap bitmap = new Bitmap(PictureBox.Width, PictureBox.Height))
{
using (Graphics gx = Graphics.FromImage(bitmap))
{
double OrbitedCircleRadius = 40;
CircleCenterClass OrbitedCircleCenter = new CircleCenterClass(60, 60);
double OrbitingCircleRadius = 7;
Pen MyRedPen = new Pen(Color.Red, 2f);
Brush MyBlackBrush = new SolidBrush(Color.Black);
gx.DrawEllipse(MyRedPen, (Int32)(OrbitedCircleCenter.X - OrbitedCircleRadius),
(Int32)(OrbitedCircleCenter.Y - OrbitedCircleRadius),
(Int32)(2 * OrbitedCircleRadius),
(Int32)(2 * OrbitedCircleRadius));
CircleCenterClass CircleCenter = GetCenterOfOrbitCircle(
OrbitedCircleCenter, OrbitedCircleRadius,
Angle);
gx.FillEllipse(MyBlackBrush, (Int32)(CircleCenter.X - OrbitingCircleRadius),
(Int32)(CircleCenter.Y - OrbitingCircleRadius),
(Int32)(2 * OrbitingCircleRadius),
(Int32)(2 * OrbitingCircleRadius));
// Draw Electronics box.
Graphics g = PictureBox.CreateGraphics();
g.Clear(BackColor);
g.DrawImage(bitmap, 0, 0);
}
}
}
private void PictureBox_Paint(object sender, PaintEventArgs e)
{
drawPictureBox(e.Graphics,false);
}
private void AngleValueTextBox_TextChanged(object sender, EventArgs e)
{
drawPictureBox(PictureBox.CreateGraphics(), true);
}
}
主な質問:
最初に画像を表示できません (つまり、GUI の起動時)。Form コンストラクターにイベントを追加しようとしましたが (ご覧のとおり)、うまくいきませんでした。「正しい」方法は何ですか?
絶えず変化するグラフィックを描画するより良い方法はありますか?