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

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

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

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

Q&A

1回答

3567閲覧

C# クリックした箇所の拡大縮小(必要コード+)clsConst.cs

kurumi123456

総合スコア45

C#

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

0グッド

1クリップ

投稿2019/02/17 13:49

編集2022/01/12 10:55

前質問からの必要コードを記載します

C#

1clsConst.cs全文 2using System.Drawing; 3using System.Windows.Forms; 4namespace BoardInspection 5{ 6 /// <summary> 7 /// 共通で使用する定義 8 /// </summary> 9 public static class clsConst 10 { 11 /// <summary> 12 /// 画像の表示モード 13 /// </summary> 14 public enum ZOOM_MODE 15 { 16 /// <summary> 17 /// 等倍 18 /// </summary> 19 FULL_SIZE = 0, 20 /// <summary> 21 /// 中間 22 /// </summary> 23 HALF = 1, 24 /// <summary> 25 /// パネルのサイズに合わせる 26 /// </summary> 27 FIT_TO_PIC = 2 28 } 29 /// <summary> 30 /// 画像の表示モード 31 /// </summary> 32 public enum SELECT_MODE 33 { 34 /// <summary> 35 /// モードなし 36 /// </summary> 37 NONE = 0, 38 /// <summary> 39 /// 領域の追加 40 /// </summary> 41 ADD_AREA = 1, 42 /// <summary> 43 /// 点の追加 44 /// </summary> 45 ADD_POINT =2, 46 /// <summary> 47 /// 領域、点の移動 48 /// </summary> 49 MOVE = 3, 50 /// <summary> 51 /// 領域、点の削除 52 /// </summary> 53 DELETE = 4 54 } 55 /// <summary> 56 /// 領域の形 57 /// </summary> 58 public enum SHAPE_TYPE 59 { 60 /// <summary> 61 /// 指定なし 62 /// </summary> 63 NONE = -1, 64 /// <summary> 65 /// 長方形 66 /// </summary> 67 RECT = 0, 68 /// <summary> 69 /// 円 70 /// </summary> 71 CIRCLE = 1, 72 /// <summary> 73 /// 多角形 74 /// </summary> 75 POLYGON = 2, 76 } 77 /// <summary> 78 /// 画像サイズを変更する 79 /// </summary> 80 /// <param name="pic">張り付けるピクチャーボックス</param> 81 /// <param name="ratio">表示倍率</param> 82 public static void ChangePictureSize(PictureBox pic, double ratio) 83 { 84 if (pic.Image != null && 0 < pic.Image.Height && 0 < pic.Image.Width) 85 { 86 pic.Height = (int)(pic.Image.Height * ratio); 87 pic.Width = (int)(pic.Image.Width * ratio); 88 } 89 } 90 /// <summary> 91 /// 画像サイズを変更する 92 /// </summary> 93 /// <param name="pic">張り付けるピクチャーボックス</param> 94 /// <param name="picture">張り付ける画像</param> 95 /// <param name="ratio">表示倍率</param> 96 public static void ChangePictureSize(PictureBox pic, Image picture, double ratio) 97 { 98 if (0 < picture.Height && 0 < picture.Width) 99 { 100 pic.Height = (int)(picture.Height * ratio); 101 pic.Width = (int)(picture.Width * ratio); 102 if (pic.Image != null) 103 { 104 pic.Image.Dispose(); 105 pic.Image = null; 106 } 107 Image newImage = new Bitmap(pic.Width, pic.Height); 108 109 Graphics gr = Graphics.FromImage(newImage); 110 gr.DrawImage(picture, 0, 0, pic.Width, pic.Height); 111 gr.Dispose(); 112 pic.Image = newImage; 113 } 114 } 115 /// <summary> 116 /// 画像の拡大モードを変更する 117 /// </summary> 118 /// <param name="e">マウスイベントの情報</param> 119 /// <param name="zoomMode">表示モード</param> 120 public static void ChangeZoom(MouseEventArgs e, ref int zoomMode) 121 { 122 if (Control.ModifierKeys == Keys.Control) 123 { 124 if (e.Button == MouseButtons.Left) 125 { 126 // 拡大 127 if ((int)clsConst.ZOOM_MODE.FULL_SIZE < zoomMode) 128 { 129 zoomMode--; 130 } 131 } 132 else if (e.Button == MouseButtons.Right) 133 { 134 // 縮小 135 if (zoomMode < (int)clsConst.ZOOM_MODE.FIT_TO_PIC) 136 { 137 zoomMode++; 138 } 139 } 140 } 141 } 142 /// <summary> 143 /// 画像の表示倍率を計算する 144 /// </summary> 145 /// <param name="ImageSize">画像のサイズ</param> 146 /// <param name="PanelSize">ピクチャーボックスを格納しているパネル</param> 147 /// <param name="zoomMode">表示モード</param> 148 /// <returns></returns> 149 public static double CalcRatio(Size ImageSize, Size PanelSize, int zoomMode) 150 { 151 // 等倍 あるはイメージがパネルより小さい場合 152 if (zoomMode == (int)ZOOM_MODE.FULL_SIZE || (ImageSize.Width<= PanelSize.Width && ImageSize.Height <= PanelSize.Height)) 153 { 154 return 1.0; 155 } 156 else 157 { 158 // 最大サイズ 159 int MaxWidth = ImageSize.Width; 160 int MaxHeight = ImageSize.Height; 161 // ピッタリにすると、スクロールバーが残るから少し小さめに 162 int MinWidth = PanelSize.Width - 5; 163 int MinHeight = PanelSize.Height - 5; 164 // パネルに合わせたときの比率を計算する 165 double RatioX = MinWidth / (double)MaxWidth; 166 double RatioY = MinHeight / (double)MaxHeight; 167 // フィットする場合 168 if (zoomMode == (int)ZOOM_MODE.FIT_TO_PIC) 169 { 170 if (RatioY < RatioX) 171 { 172 return RatioY; 173 } 174 else 175 { 176 return RatioX; 177 } 178 } 179 else 180 { 181 if (RatioY < RatioX) 182 { 183 return (RatioY + 1.0) / 2.0; 184 } 185 else 186 { 187 return (RatioX + 1.0) / 2.0; 188 } 189 } 190 } 191 192 } 193 } 194}

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

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

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

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

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

BluOxy

2019/02/17 13:52

同じ質問を何度も作るのはやめて元の質問を編集してください。 次に同じ質問をされた場合は連続投稿として通報します。
kurumi123456

2019/02/17 13:55

昨日から何度も編集していますが反映されないので
m.ts10806

2019/02/17 14:00

この質問から見た人が意味を分かると思いますか? 「編集してるけど反映されない」わけがないですし(やり方が悪いのではないかと) BluOxyさんのような感想しか持ちません。どうしてもされないというのでしたら勝手に質問をしめて勝手に新しく質問をあげるのではなく、運営に状況連絡してください。そのつもりはなくても荒らしのような印象を受けます。
m.ts10806

2019/02/17 14:02

質問や回答は文字数制限があります。その可能性は確認しましたか? もしオーバーするようであれば質問の提示の仕方(例えばコードをミニマムにしたり、別のサービスにアップしたり)工夫することで対応可能です。 自己判断だけでやっつけるのは非常に良くないです。
yzccdefine

2019/02/17 20:06

どうしたいのか 何が起こっているのか どこまで詰まってることに対して調べたのか を記述いただけないと回答は到底不可能かと思います
guest

回答1

0

FormPanel を置きます。これを panel1 とします。
panel1 に、PictureBox を置きます。これを pictureBox1 とします。
表示したい Imageimage とします。

C#

1this.panel1.AutoScroll = true; 2this.panel1.Size = new Size(320, 240); 3this.panel1.MaximumSize = new Size(320, 240); 4this.panel1.MinimumSize = new Size(320, 240); 5this.panel1.Location = new Point(0, 0); 6 7this.pictureBox1.Location = new Point(0, 0); 8this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 9this.pictureBox1.Image = this.image; 10this.pictureBox1.Size = new Size(this.image.Width, this.image.Height); 11this.pictureBox1.MouseClick += this.PictureBox1_MouseClick;

これで、pictureBox1 のサイズを、表示したいサイズに変えれば、画像は勝手に拡大縮小します。

panel1 のスクロールは、HorizontalScrollVirticalScroll プロパティからアクセスします。スクロールの最小値は 0、最大値は pictureBox1 のサイズです。
しかし、スクロールバーの位置を示す Value が取る最大値は、MaxValue からパネルの幅(高さ)を引いた値になります。
幅の場合、スクロール位置(HorizontalScroll.Value)の最大+パネルの幅(panel1.Width)から、縦スクロールバーの幅を引くと、pictureBox1.Width になります。
縦スクロールバーの幅は、Win32API で取得します。

C#

1[System.Runtime.InteropServices.DllImport("user32.dll")] 2private static extern int GetSystemMetrics(int index); 3 4int 縦スクロールバーの幅 = GetSystemMetrics(2);

その他のインデックスについては API のリファレンスを参照してください。

上記のように、画像は変更せずに PictureBox の大きさを変えて拡大縮小をするなら、現在の表示倍率は PictureBox のサイズ割る image のサイズで出ます。
クリックイベントの引数に入ってくるマウス座標に倍率を掛ければ、画像上の座標に変わります。
新しい表示サイズを元に表示倍率を求め、画像上の座標を倍率で割れば、中心に表示するべき座標になります。
後は計算。

投稿2019/02/19 05:46

Q71

総合スコア995

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問