pictureboxの拡縮について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 5,626
いつも大変お世話になっております。
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 拡縮」等で検索をかけて調べていたのですが、画像の拡縮方法ばかり載っており、自分が知りたい情報を中々探し出せなかったため、救いを求めて質問させて頂きました。
かなりざっくりした説明で申し訳ないのですが、お答え・アドバイスいただければ幸いです。
お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
描画した線を拡大したいのですが
正確には「線の間隔」を変更したいということですよね。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
メソッドというのがありますが、これだと倍率に合わせて線の太さなども変わるので、上記コードでは手動計算でスケーリングしています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/18 09:21
大変わかりやすく、イメージを掴むことができました。
サンプルコードを参考にさせて頂き、試行錯誤していこうと思います。