質問: いつも大変お世話になっております。 picturebox上でホイールを回すことで、描画した線を拡大したいのですが、どのようにプログラムを組み立てていけばいいのかわからず困っております。 以下に画像を用意させて頂きました。 図1(拡大前の画像)、 ・左下の線の交点座標を(100,100)とし、100 間隔で線を引いて行っています。(Graphics.DrawLineメソッド使用) ・左下の赤い四角は20x20とします。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/e865bd4a2db91e79663726b297de1c52.jpeg) 図2(拡大後の画像)、 ・マウスを中心に拡大拡縮されるように考えています。 ・上方向にホイールを転がすと拡大するように考えています ・下方向にホイールを転がすと縮小するように考えています。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/de9ec0af6c35a614f14553a2af6eee7d.gif) 現状としては、フォーム作成時、 this.picturebox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.picturebox1_MouseWheel); でイベントを建て、 private void naname_pb_MouseWheel(object sender, MouseEventArgs e) { } でpicturebox上でホイール操作をすると、処理が起こるようにしました。 「C# picturebox 拡縮」等で検索をかけて調べていたのですが、画像の拡縮方法ばかり載っており、自分が知りたい情報を中々探し出せなかったため、救いを求めて質問させて頂きました。 かなりざっくりした説明で申し訳ないのですが、お答え・アドバイスいただければ幸いです。 お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。
回答: > > 描画した線を拡大したいのですが > > > 正確には「線の間隔」を変更したいということですよね。PictureBoxはビットマップ画像を扱うので、ご質問のような検索ではたぶん表示イメージの拡大縮小になってしまうと思います。 PictureBoxを使ってやるとしたら、マウスホイールイベントで拡大率(スケール)を変更して、そのスケールでイメージを再描画するという方法が一般的かと思います。 簡単なサンプルコードを作ってみました。描画内容はご質問の画像とは違いますが、雰囲気は伝わると思いますので、適宜変更してください。 ``` private void Form1_Load(object sender, EventArgs e) { pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.picturebox1_MouseWheel); pictureBox1.Image = new Bitmap(pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height); drawPicture(); } private void picturebox1_MouseWheel(object sender, MouseEventArgs e) { if(e.Delta > 0) { if(scale < 300) scale += 5; } else { if(scale > 5) scale -= 5; } drawPicture(); } private int scale = 100; // 等倍=100、2倍=200 private void drawPicture() { const int GridSize = 100; int interval = GridSize * scale / 100; // 描画時の線の間隔を計算 using(var g = Graphics.FromImage(pictureBox1.Image)) { g.FillRectangle(Brushes.Black, 0, 0, pictureBox1.Image.Width, pictureBox1.Image.Height); for(int x = 0; x < pictureBox1.Image.Width; x += interval) { g.DrawLine(Pens.White, x, 0, x, pictureBox1.Image.Height); } for(int y = 0; y < pictureBox1.Image.Height; y += interval) { g.DrawLine(Pens.White, 0, y, pictureBox1.Image.Width, y); } } pictureBox1.Invalidate(); } ``` 描画操作全体のスケーリングをするための`ScaleTransform`メソッドというのがありますが、これだと倍率に合わせて線の太さなども変わるので、上記コードでは手動計算でスケーリングしています。