2008/02/19(Tue) 13:04:10 編集(投稿者)
■No14461 (Tetsu さん) に返信
> スクロール時に自動的に再描画されるようにするには、スクロールバーの部分を設定する(HScrollBar/VScrollBar コントロール)
> 必要があるということになるのでしょうか。
HScrollBar/VScrollBar を使う必要は無いはずですよ。
Panel を入れ子にして、AutoScroll でスクロールさせている分には。
// 何もコントロールを貼っていないフォームに対して、以下のコードを実行してみてください。
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
private PointF One = new PointF(50.01f, 100.01f);
private PointF Two = new PointF(100.01f, 100.01f);
private PointF Three = new PointF(120.01f, 120.01f);
CheckBox checkBox1 = new CheckBox();
Panel panel1 = new Panel();
Panel panel2 = new Panel();
public Form1()
{
InitializeComponent();
checkBox1.Text = "描画する";
checkBox1.AutoSize = true;
checkBox1.Location = Point.Empty;
this.Controls.Add(checkBox1);
panel1.AutoScroll = true;
panel1.Dock = DockStyle.Fill;
panel2.AutoSize = true;
panel2.Size = new Size(1000, 1000);
panel2.Location = Point.Empty;
checkBox1.CheckedChanged += checkBox1_CheckedChanged;
checkBox1.Checked = true;
panel1.Controls.Add(panel2);
this.Controls.Add(panel1);
this.Size = new Size(400, 400);
}
void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
panel2.Paint += panel2_Paint;
}
else
{
panel2.Paint -= panel2_Paint;
}
panel2.Invalidate();
}
void panel2_Paint(object sender, PaintEventArgs e)
{
e.Graphics.Clear(Color.Black);
int cRed = 200;
int cGreen = 100;
int cBlue = 100;
PointF[] myPoints = new PointF[3];
myPoints[0] = One;
myPoints[1] = Two;
myPoints[2] = Three;
for (int i = 0; i < 3; i++)
{
using (Pen pen = new Pen(Color.FromArgb(cRed, cGreen, cBlue), 4))
{
pen.EndCap = LineCap.ArrowAnchor;
e.Graphics.DrawLines(pen, myPoints);
}
myPoints[0] += new Size(200, 200);
myPoints[1] += new Size(200, 200);
myPoints[2] += new Size(200, 200);
cRed += 20;
cGreen += 40;
cBlue += 20;
}
}
}
}
> ループの後にxOne〜yThreeの値をxOneInit〜yThreeInitに戻してみましたが、変化はありませんでした。
戻しても意味はないと思いますよ。
ループ後に、それらの変数値が利用されることは無いのですから。
# 行き当たりばったりでコーディングするのではなく、個々の変数の変化を
# きちんと把握して開発していかないと、なかなか先に進めませんよ。
> this.panel2.AutoSize = true;
AutoSize 設定は、そのイベントが発生するたびに再設定しなければいけないのでしょうか?
> Pen pen = new Pen(Color.FromArgb(cRed, cGreen, cBlue), 4); //ペンを作成
No14350 の繰り返しになりますが、Pen の解放処理(Dispose メソッドあるいは using ブロック)を忘れています。