こちらの記事で紹介したアプリを改良しました。
s51517765.hatenadiary.jp
この中で「四角い枠を書くときにマウス(MaouseMove)に追従してマウスのボタンを離したときに確定する」というのをやりたかったのですが、うまくできなかったのですがちょうど同じことを実装している例を見つけたのでそのまま採用させていただきました。
effect.hatenablog.com
MouseClick → MouseMove → ?
というような形で実装すればできると考えていたのですが、正しくは、MouseDown → MouseMove
とするべきなようです。
MouseClick
はMouseDown + MouseUp
という形になっているようです。
引用元では、MouseUp
でリソースの開放(Dispose)を行っていますが、私は保持したままにしています。問題ない気がするけど…。
//描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(pictureBoxWidth, pictureBoxHeight); Graphics g; private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (!storeCurrentImage()) return; startPoint.X = e.Location.X;//配列の0番にクリックした座標を入れる startPoint.Y = e.Location.Y;//配列の1番にクリックした座標を入れる } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { //ImageオブジェクトのGraphicsオブジェクトを作成する g = Graphics.FromImage(canvas); // マウスの左ボタンが押されている場合のみ処理 if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left) { // 座標を取得 endPoint.X = e.Location.X; endPoint.Y = e.Location.Y; int size_x = Math.Abs(startPoint.X - endPoint.X); int size_y = Math.Abs(startPoint.Y - endPoint.Y); // 先にバックアップしていた画像で塗り潰す if (backupImage != null) g.DrawImage(backupImage, 0, 0); //Penオブジェクトの作成(幅1の黒色) Pen p = new Pen(color, (float)numericUpDownLineWidth.Value); g.DrawRectangle(p, Math.Min(startPoint.X, endPoint.X), Math.Min(startPoint.Y, endPoint.Y), size_x, size_y); pictureBox1.Image = canvas; } }
改良しました。
— プログラミング素人 (@s51517765) 2020年4月5日
四角を書くときにプレビューできるようにしました。 pic.twitter.com/1zqUCwCGSo
このアプリを使ってみたい方へ
C#のビルド環境があるかたは、Githubから丸ごとダウンロードしてビルドしてください。C#?ビルド?という方は、GitHubのReleaseフォルダから
.exe
をダウンロードください。バグレポート、プルリクエスト、追加機能提案等も歓迎です。