質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

717閲覧

コントロールのリサイズについて

k1500

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/08/22 08:52

親コントロール上に子コントロール(pictureBox1)をのせて、子コントロールのD&Dによる移動や拡大縮小をしたいと思っています。
また、pictureBox1の四隅に小さなpictureBoxA~Dをマーカーとして設置したいと考えております。
動作の具体例として左上のpictureBoxAをドラッグするとしてマウスの移動量に応じてpictureBox1のサイズが変わり、それに追従してマーカーが動くといった感じです。
D&Dでリサイズするところまでは出来ているのですが、マーカーの追従がうまくいきません。
ドラッグの際にマーカーを動かす処理を加えるとpictureBox1がリサイズされなかったので、pictureBox1のリサイズイベントでマーカーを再配置する関数を呼ぶ処理に変えましたが、ドラッグ時にマーカーが震えるような挙動をしてしまっています。
リサイズとマーカーの動きがスムーズの連動する方法についてお知恵を拝借できれば幸いです。

C#

1コード 2 //左上(A) 3 private void pictureBox_A_MouseDown(object sender, MouseEventArgs e) 4 { 5 lastMouseDownPoint = e.Location; 6 lastMouseDownSize = pictureBox1.Size; 7 isDraggable_TopLeft = true; 8 } 9 10 private void pictureBox_A_MouseMove(object sender, MouseEventArgs e) 11 { 12 if (isDraggable_TopLeft == true) 13 { 14 //マウス移動量 15 int diffX = e.X - lastMouseDownPoint.X; 16 int diffY = e.Y - lastMouseDownPoint.Y; 17 18 int w = pictureBox1.Width; //sX 19 //pictureBox1.Width -= diffX;//x方向に対して移動量だけ減算 20 pictureBox1.Width = lastMouseDownSize.Width - diffX; 21 pictureBox1.Left += w - pictureBox1.Width;//L 22 23 int h = pictureBox1.Height; 24 int h_2 = (int)(pictureBox1.Width * (1 / fixedRate)); 25 pictureBox1.Height = h_2; 26 pictureBox1.Top += h - h_2; 27 28 } 29 } 30 31 private void pictureBox_A_MouseUp(object sender, MouseEventArgs e) 32 { 33 34 isDraggable_TopLeft = false; 35 } 36 37 //右上(B) 38 private void pictureBox_B_MouseDown(object sender, MouseEventArgs e) 39 { 40 isDraggable_TopRight = true; 41 lastMouseDownPoint = e.Location; 42 lastMouseDownSize = pictureBox1.Size; 43 } 44 45 private void pictureBox_B_MouseMove(object sender, MouseEventArgs e) 46 { 47 if (isDraggable_TopRight == true) //右上(ok) 48 { 49 //マウス移動量 50 int diffX = e.X - lastMouseDownPoint.X; 51 int diffY = e.Y - lastMouseDownPoint.Y; 52 53 pictureBox1.Width = lastMouseDownSize.Width + diffX;//W 54 55 int h = pictureBox1.Height; 56 int h2 = (int)(pictureBox1.Width * (1 / fixedRate)); 57 pictureBox1.Height = h2; 58 pictureBox1.Top += h - h2; 59 } 60 } 61 62 private void pictureBox_B_MouseUp(object sender, MouseEventArgs e) 63 { 64 isDraggable_TopRight = false; 65 } 66 67 //右下(C) 68 private void pictureBox_C_MouseDown(object sender, MouseEventArgs e) 69 { 70 isDraggable_BottomRight = true; 71 lastMouseDownPoint = e.Location; 72 lastMouseDownSize = pictureBox1.Size; 73 } 74 75 private void pictureBox_C_MouseMove(object sender, MouseEventArgs e) 76 { 77 78 if (isDraggable_BottomRight == true) //右下(ok) 79 { 80 //マウス移動量 81 int diffX = e.X - lastMouseDownPoint.X; 82 int diffY = e.Y - lastMouseDownPoint.Y; 83 pictureBox1.Width = lastMouseDownSize.Width + diffX; 84 pictureBox1.Height = (int)(pictureBox1.Width * (1 / fixedRate)); 85 } 86 } 87 88 private void pictureBox_C_MouseUp(object sender, MouseEventArgs e) 89 { 90 isDraggable_BottomRight = false; 91 } 92 93 //左下 94 private void pictureBox_D_MouseDown(object sender, MouseEventArgs e) 95 { 96 isDraggable_BottomLeft = true; 97 lastMouseDownPoint = e.Location; 98 lastMouseDownSize = pictureBox1.Size; 99 } 100 101 private void pictureBox_D_MouseMove(object sender, MouseEventArgs e) 102 { 103 if (isDraggable_BottomLeft == true) //左下(ok) 104 { 105 //マウス移動量 106 int diffX = e.X - lastMouseDownPoint.X; 107 int diffY = e.Y - lastMouseDownPoint.Y; 108 109 int w = pictureBox1.Width; 110 //pictureBox1.Width -= diffX; 111 pictureBox1.Width = lastMouseDownSize.Width - diffX; 112 pictureBox1.Left += w - pictureBox1.Width; 113 114 pictureBox1.Height = (int)(pictureBox1.Width * (1 / fixedRate)); 115 } 116 } 117 118 private void pictureBox_D_MouseUp(object sender, MouseEventArgs e) 119 { 120 isDraggable_BottomLeft = false; 121 } 122 123 private void pictureBox1_Resize(object sender, EventArgs e) 124 { 125 point_setting();//マーカー再配置 126 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/22 09:37

コードは ``` と ``` で囲ってください。インデントされて読み易くなりますので。
k1500

2018/08/22 09:38

了解しました。
退会済みユーザー

退会済みユーザー

2018/08/22 09:39

あと、何を作っているかと(Windows Forms? WPF? ASP.NET Web Froms? その他?)、開発環境(OS, .NET, Visual Studio のバージョンなど)を書きましょう。
k1500

2018/08/22 09:42

作っているのはWindows Forms、開発環境はWin7でVS2017、.NETは4.6になります。
guest

回答1

0

ベストアンサー

細かいところは見ていませんが、pictureBox_A~DのMouseMoveイベントでpictureBox1の大きさを変更した後、point_settingでマーカーを再配置すればいいのではないかと思います。
また、このままではMouseMoveイベントのe.X,e.Yの座標とずれが出るので

C#

1 //左上(A) 2 private void pictureBox_A_MouseDown(object sender, MouseEventArgs e) 3 { 4 lastMouseDownPoint = pictureBox_A.Parent.PointToClient(System.Windows.Forms.Cursor.Position); 5 lastMouseDownSize = pictureBox1.Size; 6 isDraggable_TopLeft = true; 7 } 8 9 private void pictureBox_A_MouseMove(object sender, MouseEventArgs e) 10 { 11 if (isDraggable_TopLeft == true) 12 { 13 //マウス移動量 14 Point NowPoint = pictureBox_A.Parent.PointToClient(System.Windows.Forms.Cursor.Position); 15 int diffX = NowPoint.X - lastMouseDownPoint.X; 16 int diffY = NowPoint.Y - lastMouseDownPoint.Y; 17 18 int w = pictureBox1.Width; //sX 19 //pictureBox1.Width -= diffX;//x方向に対して移動量だけ減算 20 pictureBox1.Width = lastMouseDownSize.Width - diffX; 21 pictureBox1.Left += w - pictureBox1.Width;//L 22 23 int h = pictureBox1.Height; 24 int h_2 = (int)(pictureBox1.Width * (1 / fixedRate)); 25 pictureBox1.Height = h_2; 26 pictureBox1.Top += h - h_2; 27 28 point_setting(); 29 30 } 31 } 32

みたいにスクリーン座標→親のコントロールのクライアント座標と変換すれば、座標のずれはなくなるかと思います。

投稿2018/08/22 12:59

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k1500

2018/08/23 04:28

回答頂きありがとうございます。 ご指摘頂いた点を修正したところ、目的としていた動きを再現することができました。 大変明快なアドバイスに感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問