2015/06/12(金) [n年前の日記]
#1 [prog] VS2013でC#と.NETの勉強中
画像やテキストの配置・レイアウトができる感じのツールを作ろうとしているところ、なのだけど。
マウスドラッグで画像の位置を移動することはできた。結局、複数の PictureBox を配置するのは諦めて、配置済みの PictureBox の Paintイベントで毎回複数の画像を全部描き直してどうにか。DrawImage(Bitmap, x, y) を使うというか。
後は PictureBox の MouseDown、MouseMove、MouseUp で、複数画像の各描画範囲とマウスカーソル座標をチェックして、マウスボタンが押された時にマウスカーソル座標が画像内に入ってたらその画像が選ばれたのだ、みたいな感じの処理を。
ていうか、ソースの一部を貼ったほうが早いのでは…。
マウスドラッグで画像の位置を移動することはできた。結局、複数の PictureBox を配置するのは諦めて、配置済みの PictureBox の Paintイベントで毎回複数の画像を全部描き直してどうにか。DrawImage(Bitmap, x, y) を使うというか。
後は PictureBox の MouseDown、MouseMove、MouseUp で、複数画像の各描画範囲とマウスカーソル座標をチェックして、マウスボタンが押された時にマウスカーソル座標が画像内に入ってたらその画像が選ばれたのだ、みたいな感じの処理を。
ていうか、ソースの一部を貼ったほうが早いのでは…。
// PictureBox上でマウスボタンが押された private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { int mouseX = e.X; int mouseY = e.Y; buttonPressed = true; Boolean multiSelect = false; // Shiftキーが押されてるなら複数選択モード if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) multiSelect = true; Boolean fg = false; for (int i = images.Count - 1; i >= 0; i--) { ObjData o = images[i]; o.setOffset(mouseX, mouseY); // マウス座標からのオフセット値を記録 if (!multiSelect) o.selected = false; if (!fg && o.x <= mouseX && mouseX <= (o.x + o.w) && o.y <= mouseY && mouseY <= (o.y + o.h)) { // マウス座標と重なってるオブジェクトの選択状態を切り替える o.selected = !o.selected; fg = true; } } pictureBox1.Invalidate(); setStatusObjInfoNow(); } // PictureBox 上でマウスボタンが離された private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { buttonPressed = false; setStatusObjInfoNow(); } // PictureBox 上でマウスがドラッグされた private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (buttonPressed && countSelectedObject() > 0) { int mouseX = e.X; int mouseY = e.Y; // 選択されてるオブジェクトは全て移動する foreach (ObjData o in images) if (o.selected) o.changePosition(mouseX, mouseY); pictureBox1.Invalidate(); setStatusObjInfoNow(); } }
◎ 左揃え、右揃え等も実装。 :
左揃え、中央揃え、右揃え、上揃え、縦中央揃え、下揃え、は実装できた。
動作テストしていて思ったけれど、均等割り付け? 均等配置?も必要な予感。…アレって英語でなんて言うんだろ。Distribute? アレも横方向と縦方向、上、中央、下があるよな…。
やっぱり Inkscape で配置してSVGを変換したほうが早いのかも…。
動作テストしていて思ったけれど、均等割り付け? 均等配置?も必要な予感。…アレって英語でなんて言うんだろ。Distribute? アレも横方向と縦方向、上、中央、下があるよな…。
やっぱり Inkscape で配置してSVGを変換したほうが早いのかも…。
◎ JSONでレイアウトを保存できた。 :
DataContractJsonSerializer なるものを使えばJSONへのシリアライズ、デシリアライズができるらしい。…シリアライズ、デシリアライズって何だ? ググってみたら、オブジェクトからJSON文字列にするのをシリアライズ、JSON文字列からオブジェクトにするのをデシリアライズ、と呼ぶらしい。たぶん。
_シリアライズ - Wikipedia
_シリアライズ - Wikipedia
◎ これからやりたいこと。 :
- グリッドにスナップさせて移動できるようにしたい。
- カーソルキーで1ドット単位の移動をさせたい。
- テキスト描画の範囲を正確に取得したい。
[ ツッコむ ]
以上です。