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

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

ただいまの
回答率

90.47%

  • C#

    7433questions

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

  • Visual Studio 2013

    308questions

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

pictureboxの拡縮について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,348

fender0131

score 113

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

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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メソッドというのがありますが、これだと倍率に合わせて線の太さなども変わるので、上記コードでは手動計算でスケーリングしています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/18 09:21

    お答えありがとうございます。

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

    キャンセル

関連した質問

  • 解決済

    teratailで画像を貼る方法

    teratailで質問する際、画像の貼り方がわからないのでやりかたを教えてください! 質問をするときレイアウトの状況などを直感的に伝えたいときなどに文章で説明するので冗長になって

  • 解決済

    cssで指定したfont-sizeの実サイズを知りたい

    例えばfont-size: 5vwと指定した場合、これをpxに換算したら何ピクセルになるのか知りたいのですが、Chromeの開発者ツールか何かで知る方法はないでしょうか?

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    C#からGoogle Sheets APIを呼び出したい

    前提・実現したいこと Visual Studio 2015でアプリ作成中です。 C#からGoogle Sheets APIを呼び出したいのですが、実行するとエラーメッセージが表

  • 解決済

    railsで紐づけしたデータを表示させるには

    前回の続き(railsのDBに関する質問)です。 前回の回答で、characterテーブルとmasterpieceテーブルの紐づけはできました。 consoleの方で試したとこ

  • 解決済

    unity-chanモーション

    unity-chanをmixamoを使ってモーション数を 増やしたいのですが仕方がいまいちわかりません。 現在したのが、 1mixamoにfbxデータをアップデートする 2mi

  • 解決済

    Game Jam Menu Template での画面遷移

     前提 現在Unityで3Dのすごろく(風)ゲームを作成しています。 Game Jam Menu Template を使ってタイトル画面を作成しています。  実現したいこと タ

  • 解決済

    Seleniumを利用したリンクを順にクリックして個別の要素を取得するプログラムについて

    Pythonを使ったスクレイピングについての質問です。 こちら↓のサイトを参考にして、 https://qiita.com/Gen6/items/66f190d3c9e345e97

同じタグがついた質問を見る

  • C#

    7433questions

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

  • Visual Studio 2013

    308questions

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