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

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

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

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

1回答

9077閲覧

pictureboxの拡縮について

fender0131

総合スコア121

C#

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2016/04/15 04:18

いつも大変お世話になっております。

picturebox上でホイールを回すことで、描画した線を拡大したいのですが、どのようにプログラムを組み立てていけばいいのかわからず困っております。

以下に画像を用意させて頂きました。

図1(拡大前の画像)、
・左下の線の交点座標を(100,100)とし、100 間隔で線を引いて行っています。(Graphics.DrawLineメソッド使用)
・左下の赤い四角は20x20とします。

イメージ説明

図2(拡大後の画像)、
・マウスを中心に拡大拡縮されるように考えています。
・上方向にホイールを転がすと拡大するように考えています
・下方向にホイールを転がすと縮小するように考えています。

イメージ説明

現状としては、フォーム作成時、
this.picturebox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.picturebox1_MouseWheel);

でイベントを建て、

private void naname_pb_MouseWheel(object sender, MouseEventArgs e)
{
}

でpicturebox上でホイール操作をすると、処理が起こるようにしました。

「C# picturebox 拡縮」等で検索をかけて調べていたのですが、画像の拡縮方法ばかり載っており、自分が知りたい情報を中々探し出せなかったため、救いを求めて質問させて頂きました。

かなりざっくりした説明で申し訳ないのですが、お答え・アドバイスいただければ幸いです。

お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

描画した線を拡大したいのですが

正確には「線の間隔」を変更したいということですよね。PictureBoxはビットマップ画像を扱うので、ご質問のような検索ではたぶん表示イメージの拡大縮小になってしまうと思います。

PictureBoxを使ってやるとしたら、マウスホイールイベントで拡大率(スケール)を変更して、そのスケールでイメージを再描画するという方法が一般的かと思います。

簡単なサンプルコードを作ってみました。描画内容はご質問の画像とは違いますが、雰囲気は伝わると思いますので、適宜変更してください。

C#

1private void Form1_Load(object sender, EventArgs e) 2{ 3 pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.picturebox1_MouseWheel); 4 pictureBox1.Image = new Bitmap(pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height); 5 drawPicture(); 6} 7 8private void picturebox1_MouseWheel(object sender, MouseEventArgs e) 9{ 10 if(e.Delta > 0) 11 { 12 if(scale < 300) 13 scale += 5; 14 } 15 else 16 { 17 if(scale > 5) 18 scale -= 5; 19 } 20 drawPicture(); 21} 22 23private int scale = 100; // 等倍=100、2倍=200 24 25private void drawPicture() 26{ 27 const int GridSize = 100; 28 int interval = GridSize * scale / 100; // 描画時の線の間隔を計算 29 using(var g = Graphics.FromImage(pictureBox1.Image)) 30 { 31 g.FillRectangle(Brushes.Black, 0, 0, pictureBox1.Image.Width, pictureBox1.Image.Height); 32 for(int x = 0; x < pictureBox1.Image.Width; x += interval) 33 { 34 g.DrawLine(Pens.White, x, 0, x, pictureBox1.Image.Height); 35 } 36 for(int y = 0; y < pictureBox1.Image.Height; y += interval) 37 { 38 g.DrawLine(Pens.White, 0, y, pictureBox1.Image.Width, y); 39 } 40 } 41 pictureBox1.Invalidate(); 42}

描画操作全体のスケーリングをするためのScaleTransformメソッドというのがありますが、これだと倍率に合わせて線の太さなども変わるので、上記コードでは手動計算でスケーリングしています。

投稿2016/04/15 08:59

catsforepaw

総合スコア5938

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

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

fender0131

2016/04/18 00:21

お答えありがとうございます。 大変わかりやすく、イメージを掴むことができました。 サンプルコードを参考にさせて頂き、試行錯誤していこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問