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

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

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

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

Q&A

解決済

3回答

1242閲覧

C# クリックしたポイントを拡大縮小

kurumi123456

総合スコア45

C#

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

0グッド

0クリップ

投稿2019/02/16 14:16

編集2019/02/16 14:30

C#でクリックしたポイントを拡大縮小するという処理を行いたいのですが、下のコードで実行はとおるのですが、クリックしたところが拡大されません。

なにをどうなおせばとおるでしょうか

C#

1/// <summary> 2 /// ピクチャーボックスクリック(画像サイズ変更) 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void picMaster_MouseClick(object sender, MouseEventArgs e) 7 { 8 if (picMaster.Image != null) 9 { 10 double a = e.X; 11 double b = e.Y; 12 13 { 14 clsConst.ChangeZoom(e, ref m_zoomMode); 15 m_ratio = clsConst.CalcRatio(m_image.Size, pnlMaster.Size, m_zoomMode); 16 clsConst.ChangePictureSize(picMaster, m_image, m_ratio); 17 } 18 19 //X座標を取得する 20 double na = a * m_ratio; 21 //Y座標を取得する 22 double nb = b * m_ratio; 23 24 //スクロールバー移動 25 this.AutoScrollPosition = new Point(-this.AutoScrollPosition.X + (int)na, -this.AutoScrollPosition.Y + (int)nb); 26 } 27 }

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

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

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

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

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

BluOxy

2019/02/16 14:49 編集

clsConstクラスは自作ですか?clsConstがpicMaster.Imageを変更しているのでしょうか。 とにかく中の挙動が全然わかりませんが、もしそのクラスで拡大を行っているのならclsConstで定義されているメソッドの内容に問題があるかと思います。
BluOxy

2019/02/17 13:46

このページの問題が解決された訳ではないでしょう。 同じ内容の問題が散在するので、新しい質問を作るのではなく既存の質問を修正してください。 とは言え、出来てしまったページは仕方ないので同じ旨の質問は1つのページにまとまるよう「このページ」か「新しく作られたページ」のどちらかを削除リクエストしてください。
BluOxy

2019/02/17 13:49

次からはまとめるために新しい質問を作るのではなく、元の質問を編集する形でまとめてくださいね。 編集した部分はこちらで確認できるので余程質問内容が変わらない限りは問題ありません。 よろしくお願いします。
guest

回答3

0

自己解決

必要コードを記載します
https://teratail.com/questions/174906

投稿2019/02/17 14:00

kurumi123456

総合スコア45

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

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

0

https://teratail.com/questions/172019
https://teratail.com/questions/171129
以前から同じ質問を、何度も上げているようですが?

AutoScrolltrue にした PanelPictureBoxLocation = (0, 0) でおいて、SizeModePictureBoxSizeMode.StretchImage にする。その上で、PictureBoxSize を任意に変えてやれば、イメージはそのままで表示は拡縮します。
PictureBox でクリックしたとき、特にスクロールバーが出ていて、スクロールをしているときにどの座標が返ってくるのか、忘れましたが、それもデバッガで止めてイベント変数を調べればわかりますよね。現在のスクロール量は Panel の方からとれます。何度も質問するよりやってみた方が早いし、やってみてわからないのであれば、

  • やってみたこと
  • その試みを行った根拠(どこどこに書いてあった、など)
  • その試みで得られると期待した結果
  • 実際に得られた結果

も、書いてください。

投稿2019/02/17 10:28

Q71

総合スコア995

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

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

guest

0

eclsConstが何を示しているのかは全く分かりませんが、
拡大だけならこう書けば動くのではないでしょうか

C#

1 /// <summary> 2 /// ピクチャーボックスクリック(画像サイズ変更) 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void picMaster_MouseClick(object sender, MouseEventArgs e) 7 { 8 if (picMaster.Image != null) 9 { 10 double a = e.X; 11 double b = e.Y; 12 13 //X座標を取得する 14 double na = a * m_ratio; 15 //Y座標を取得する 16 double nb = b * m_ratio; 17 18 Bitmap canvas = new Bitmap(picMaster.Image,picMaster.Width* na, picMaster.Height* nb); 19 picMaster.Image = canvas; 20 21 //スクロールバー移動 22 this.AutoScrollPosition = new Point(-this.AutoScrollPosition.X + (int)na, -this.AutoScrollPosition.Y + (int)nb); 23 } 24 }

もし倍率が厳密に指定されている場合、読み込んだ画面全体を保持する機構がないため上記コードでは縮小ができません

  • 最初に読み込んだ画像全体のImage
  • 拡大率
  • 表示する画像の範囲

を保持するメンバーが定義されており、それらの情報を取り扱って適切に現在の画像を表示できるクラスを作成しないといけません。もしくはそのような既存のライブラリ等があれば利用するでも構いません。

倍率が固定な場合は
0. 番号リスト 縮小前のImageインスタンスをList<Image>やStack<Image>等のリソースに保持
0. 縮小時には一番上の(最後に追加された)Imageを表示

と言った処理を私が提示したコードから追加のコードを書けば可能かと思います。

投稿2019/02/16 14:45

編集2019/02/16 15:01
BluOxy

総合スコア2663

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問