C#について解決いたしました。本当に助かりました。またどうぞ宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答が付いた質問の編集は慎重に行ってください。タイプミス程度なら修正する事もありますが、本文を削除するのはやめましょう。過去の投稿を表示できるので、それを使って記事を復元してください。https://teratail.com/questions/history-questions/50360
回答3件
0
ベストアンサー
抽出結果が複数あるので、描画するだけです
ただ、このコードだとマウス座標が変わる度に
検索&描画を行う為、四角の数が増えると重くなると思います
要改善です
C#
1using System; 2using System.Collections.Generic; 3using System.Data; 4using System.Drawing; 5using System.Linq; 6using System.Windows.Forms; 7 8namespace WindowsFormsApplication1 9{ 10 public partial class Form1 : Form 11 { 12 // 四角形の座標List 13 List<Rectangle> _rects = new List<Rectangle>(); 14 15 // 赤枠になっている四角形の座標配列 16 Rectangle[] _prev = new Rectangle[0]; 17 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void Form1_Load(object sender, EventArgs e) 24 { 25 Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height); 26 27 using (Graphics g = Graphics.FromImage(canvas)) 28 using (Pen pen = new Pen(Color.Blue)) 29 { 30 Random rnd = new Random(); 31 32 // 400個の四角形を作成 33 for (int i = 0; i < 400; i++) 34 { 35 int x = rnd.Next(0, canvas.Width - 100); 36 int y = rnd.Next(0, canvas.Height - 100); 37 Rectangle r = new Rectangle(x, y, 100, 100); 38 39 // 四角形描画 40 g.DrawRectangle(pen, r); 41 42 // 座標をListへ追加 43 _rects.Add(r); 44 } 45 } 46 47 pictureBox1.Image = canvas; 48 } 49 50 private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 51 { 52 // カーソル座標にある四角形を全て抽出 53 Rectangle[] hitRects = _rects.AsEnumerable() 54 .Where(v => 55 v.X <= e.X && v.Y <= e.Y && 56 (v.X + v.Width) >= e.X && (v.Y + v.Height) >= e.Y) 57 .Select(v => v) 58 .ToArray(); 59 60 using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 61 { 62 // 前回描画した赤枠を青枠に戻す 63 if (_prev.Length > 0) 64 { 65 using (Pen pen = new Pen(Color.Blue)) 66 { 67 g.DrawRectangles(pen, _prev); 68 } 69 } 70 71 // 抽出結果が1個以上あれば描画開始 72 if (hitRects.Length > 0) 73 { 74 using (Pen pen = new Pen(Color.Red)) 75 { 76 // 赤枠四角描画 77 g.DrawRectangles(pen, hitRects); 78 } 79 } 80 81 // 今回描画した赤枠座標を保存 82 _prev = hitRects; 83 84 // PictureBox更新 85 pictureBox1.Refresh(); 86 } 87 } 88 } 89}
投稿2016/10/06 03:27
編集2016/10/06 08:59総合スコア201
0
こんなんでどうでしょうか?
C#
1using System; 2using System.Collections.Generic; 3using System.Data; 4using System.Drawing; 5using System.Linq; 6using System.Windows.Forms; 7 8namespace WindowsFormsApplication1 9{ 10 public partial class Form1 : Form 11 { 12 List<Rectangle> _rects = new List<Rectangle>(); 13 Rectangle _prev = default(Rectangle); 14 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void Form1_Load(object sender, EventArgs e) 21 { 22 Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height); 23 24 using (Graphics g = Graphics.FromImage(canvas)) 25 using (Pen pen = new Pen(Color.Blue)) 26 { 27 Random rnd = new Random(); 28 29 for (int i = 0; i < 10; i++) 30 { 31 int x = rnd.Next(0, canvas.Width - 100); 32 int y = rnd.Next(0, canvas.Height - 100); 33 Rectangle r = new Rectangle(x, y, 100, 100); 34 35 g.DrawRectangle(pen, r); 36 _rects.Add(r); 37 } 38 } 39 40 pictureBox1.Image = canvas; 41 } 42 43 private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 44 { 45 List<Rectangle> hitRects = _rects.AsEnumerable() 46 .Where(v => 47 v.X <= e.X && v.Y <= e.Y && 48 (v.X + v.Width) >= e.X && (v.Y + v.Height) >= e.Y) 49 .Select(v => v) 50 .ToList(); 51 52 if(hitRects.Count > 0) 53 { 54 using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 55 { 56 if (_prev != default(Rectangle)) 57 { 58 using (Pen pen = new Pen(Color.Blue)) 59 { 60 g.DrawRectangle(pen, _prev); 61 } 62 } 63 64 using (Pen pen = new Pen(Color.Red)) 65 { 66 g.DrawRectangle(pen, hitRects[0]); 67 } 68 } 69 70 _prev = hitRects[0]; 71 pictureBox1.Refresh(); 72 } 73 } 74 } 75} 76
投稿2016/10/05 09:19
編集2016/10/05 09:30総合スコア201
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。