|
ごめん、ノートでやったら現象起きた。 検証してみるとUnion後のlastRgは、 2つの矩形をあわせたものが期待されるが、 欠けたり残像したりするときのUnion後のlastRgが その部分が欠けたものなっているな。 なんでなんだろ。原因はわからない。
あとGraphicsオブジェクトはDisposeするように。
// 検証コード public Form1() { InitializeComponent();
pictureTileListOn.Image = new Bitmap(1280, 1024); lastRg = new Region(); Rectangle rect = new Rectangle(); }
//選択矩形の描画始点 private int xLeft; private int yTop; //選択数 private int xSelectNum; private int ySelectNum; //最初に選択したタイル private int xSelect; private int ySelect; //マウスカーソルの座標 private int xNow; private int yNow;
private Region newRg; private Region lastRg; private Rectangle rect; private List<Region> rgs = new List<Region>(); private int rgsIdx; private void pictureTileListOn_MouseDown(object sender, MouseEventArgs e) { xSelect = e.X / 32; ySelect = e.Y / 32; SelectRectDraw((PictureBox)sender, e); } private void pictureTileListOn_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right || e.Button == MouseButtons.Left) { SelectRectDraw((PictureBox)sender, e); } } private void SelectRectDraw(PictureBox pBox, MouseEventArgs e) { if (xNow == e.X / 32 && yNow == e.Y / 32) { return; } //if (e.X >= pBox.Width || e.X < 0 || e.Y >= pBox.Height || e.Y < 0) { return; } System.Diagnostics.Debug.WriteLine("A"); xNow = e.X / 32; yNow = e.Y / 32;
Pen selectPen = new Pen(Color.White, 2); Pen edgePen = new Pen(Color.Black, 4);
Graphics g = Graphics.FromImage(pBox.Image); g.Clear(Color.Transparent);
//位置確定 if (xNow <= xSelect) { xLeft = xNow; } else { xLeft = xSelect; } xSelectNum = (xNow <= xSelect ? xSelect - xNow : xNow - xSelect) + 1;
if (yNow <= ySelect) { yTop = yNow; } else { yTop = ySelect; } ySelectNum = (yNow <= ySelect ? ySelect - yNow : yNow - ySelect) + 1;
//描画位置設定 rect.X = xLeft * 32 + (int)edgePen.Width / 2; rect.Y = yTop * 32 + (int)edgePen.Width / 2; rect.Width = xSelectNum * 32 - (int)edgePen.Width; rect.Height = ySelectNum * 32 - (int)edgePen.Width;
//g.DrawRectangle(edgePen, rect);
//------------------------ //ペン幅の半分だけ拡張したrgionオブジェクトを作る rect.X -= 2; rect.Y -= 2; rect.Width += 4; rect.Height += 4; newRg = new Region(rect); //縮小 rect.X += 4; rect.Y += 4; rect.Width -= 8; rect.Height -= 8; //中抜き newRg.Xor(rect); g.FillRegion(Brushes.Black, newRg); lastRg.Union(newRg.Clone());
// 領域の履歴をとる rgs.Add(lastRg.Clone());
pBox.Invalidate(lastRg); pBox.Update(); g.Dispose(); lastRg = newRg; //------------------------ System.Diagnostics.Debug.WriteLine("B"); }
// 過去10の履歴を見る private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (rgsIdx > 10) rgsIdx = 0; this.Text = rgsIdx.ToString(); Graphics g = Graphics.FromImage(this.pictureTileListOn.Image); g.Clear(Color.White); g.FillRegion(Brushes.Black, rgs[rgs.Count - 11 + rgsIdx]); g.Dispose(); pictureTileListOn.Invalidate(); rgsIdx += 1; }
|