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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

10887閲覧

pictureboxにbitmapでグラフ表示で拡大縮小とスクロールバーをつけたい

csuser01234

総合スコア38

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2016/06/10 13:39

編集2016/06/10 16:49

visual studio 2015 community C#でpictureboxにbitmapでグラフ表示をさせています。
画像の拡大縮小のやり方をネットで調べて一度実装してみたのですが、拡大すると解像度がかわり画像が荒くなってしまうので再描画する方法に変更しました。
DrawLine()で指定するX座標の値を変更する事で、グラフの横幅をかえる事は出来たのですが、ピクチャサイズよりはみ出すような大きいサイズを描画した時に、スクロールバーを出して全体が見れるようにするやり方がわかりません。サンプルか参考サイトあれば知りたいです。よろしくお願いします。

まとめるとやりたい事は下記です。
1、拡大縮小が出来るようになりたい。
2、拡大した時だけスクロールバーを出して移動表示をさせたい
3、数種類のラジオボタンを用意して、時間単位表示の変更をしたい
4、X軸に目盛をつけたい。さらに拡大縮小した時に表示に合わせた目盛の表示をさせたい

以上の4つです。特にやりたいのは1の拡大縮小と2のスクロールバーの表示と操作です。
1と2が出来れば3はそんなに難しくないかなと思って居ます。4のX軸の目盛をつけて縮尺に合わせた表示は現時点ではイメージすら湧きません。
尚、チャートを使用してのグラフ表示アプリを作った際は、1~4は全て実装出来ました。部品自体にプロパティで設定が用意されていたので、コーディングと言うかマウスしか使いませんでしたが。

1の拡大縮小ですが、chartの時はカーソルを合わせてクリック&ドラッグで拡大させる事が出来ましたが、pictureboxの場合はおそらくそれは無理かなと思って居ます。そこも含めて教えて頂ければと思います。

現時点のグラフ表示のみ出来ているコードは下記です。

C#

1m_Bitmap = new Bitmap(pg.Size.Width, pg.Size.Height);//Width=横、Height=高さ 2 SizeHeight_hurf = pg.Size.Height / 2;//基準点を取得0になるところ 3 box_w = (double)pg.Size.Width / (double)graph_kasokudo_x.Count;//x軸の座標進行用 4 pg.Image = m_Bitmap; 5 6 Graphics g = Graphics.FromImage(pg.Image); 7 //----------------------------------- 8 // グラフを描画 9 //----------------------------------- 10 g.FillRectangle(Brushes.Black, 0, 0, pg.Size.Width, pg.Size.Height);//指定された内部を塗りつぶす。ピクチャボックスを取得したサイズ分黒で塗りつぶす 11 12 // 縦線 13 Int32 cy = pg.Size.Height / BoxSize; 14 for (Int32 y = 0; y <= cy; y++) 15 {//DrawLineは2つの点を直線で結ぶ 横右端から 16 g.DrawLine(Pens.Green, 0, pg.Size.Height - (y * BoxSize), pg.Size.Width, pg.Size.Height - (y * BoxSize)); 17 } 18 // 横線 19 Int32 cx = (pg.Size.Width + m_X) / BoxSize; 20 for (Int32 x = 0; x <= cx; x++) 21 { 22 g.DrawLine(Pens.Green, pg.Size.Width - (x * BoxSize) - m_X, 0, pg.Size.Width - (x * BoxSize) - m_X, pg.Size.Height); 23 } 24 25 //----------------------------------- 26 // データを描画 27 //----------------------------------- 28 double x1; 29 double x2; 30 double[] dblTemp00 = new double[Form1.Form1Instance.graph_kakusokudo_x.Count]; 31 32 dblTemp00[0] = SizeHeight_hurf + ((double)((double)graph_kasokudo_x[0] * (double)(SizeHeight_hurf - 1)) / zettaiti); 33 for (Int32 i = 1; i < Form1.Form1Instance.graph_kasokudo_x.Count; i++) 34 {//直線を引くために2点分用意 35 dblTemp00[i] = SizeHeight_hurf + ((double)(graph_kasokudo_x[i] * (double)(SizeHeight_hurf - 1)) / zettaiti); 36 //青の直線で折れ線グラフを引いていく 37 x1 = (i-1) * box_w; 38 x2 = x1 + box_w; 39 g.DrawLine(Pens.SkyBlue, (float)x1, (int)(pg.Size.Height - dblTemp00[i-1]), (float)x2, (int)(pg.Size.Height - dblTemp00[i])); 40 } 41if (++m_X >= BoxSize) m_X = 0; 42 43 pg.Refresh();

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

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

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

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

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

csuser01234

2016/06/10 16:49

現状と、やった事を記載しました。
guest

回答1

0

ベストアンサー

Form に Panel を貼り付け、Anchor を適切な値にし、AutoScroll を true にします。
その上に PictureBox を貼り付け、Anchor を Top と Left だけにします。
PictureBox を画像の拡大縮小に合わせてサイズ変更します。
PictureBox が Panel のサイズより大きくなるとスクロールバーが自動的に現れます。

投稿2016/06/10 23:20

編集2016/06/10 23:39
Zuishin

総合スコア28660

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

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

csuser01234

2016/06/11 09:24

回答ありがとうございます。 その方法は既にやってみたのですが、拡大時に解像度が荒くなってしまう為、できれば再描画して拡大したように見せる方法を覚えたいと思って居ます。
Zuishin

2016/06/11 09:39

やってないと思いますよ。 拡大時にはビットマップとピクチャーボックスの両方のサイズを大きくして再描画すればいいという意味なのですが。 ピクチャーボックスを拡大する事によってコーディング無しでパネルにスクロールボックスが出ます。
csuser01234

2016/06/11 11:42

すみません理解出来ました。そして作りこみも出来ました。ありがとうございます。 ピクチャサイズを変更する都度グラフを再描画する事で、以前あった解像度の問題が解決出来ました。感謝致します。 X軸に目盛を付ける方法ですが、現時点ではピクチャボックスの下と左にテキストラベル部品を適当にいくつかおいて、拡大縮小処理の都度数値を書き換えると言う方法ぐらいしか思いつかないのですが、こういう場合一般的にはどうつくるのが推奨されるのでしょうか?それが出来たらそのテキストラベルをクリックして時間帯を変更→変更した時間帯のグラフのあたりにジャンプ表示すると言うところまでつくる予定です。
Zuishin

2016/06/11 13:56

一般に推奨されるのは ChartControl を使うことです。
Zuishin

2016/06/12 00:29

Chart を使わないという縛りがあるなら、私なら Bitmap に描画するのではなく WPF を使いますね。 ベクタグラフィックなので拡大縮小しても劣化しませんし、表示されているものすべてがイベントを持ちますから柔軟性があります。 Chart で実現できない機能が欲しいために最初から作るという感じでもないですし、宿題でしょうかね。だとしたら一から十まで全部聞くのではなく、テキストラベルならテキストラベルを使ったものを一度作ってから聞けばいいのにと思います。
csuser01234

2016/06/13 00:03

chartを使用した方がいいのはわかっていますが、bitmapでやらないといけないと言う縛りがあります。 DrawString()と言う命令があるのを知ってそれを使ってX軸の目盛を画像の下部に出す事で目盛は出す事が出来ました。しかし拡大した時に(パネル内の画像を拡大してグラフ再描画)した時にY軸の目盛を画像の左側に出しても隠れてしまいます。
Zuishin

2016/06/13 00:50

隠れない位置を計算して描画すればいいと思います。 MeasureString() について調べてみてください。 クリックについては PictureBox のクリックイベントの座標から計算すればいいと思います。
csuser01234

2016/06/13 16:28

取得した文字列のサイズを取得するのに使用する命令と言う事でいいでしょうか? ピクチャボックス内の左端にY軸目盛の値を書いても、拡大した時にスクロールバーで右に持っていくと、左端に表示していた目盛は見えなくなってしまうと言う問題がこれでどう解決するのか、まだよく理解出来ません。理解力が低くすみません。
Zuishin

2016/06/13 21:27

ビットマップにラベルを描かなければならないという縛りがあるなら、ビットマップをスクロールしたら隠れるのは当然です。
csuser01234

2016/06/14 00:03

ビットマップを使用すると言うしばりはありますが、ラベルを使用すると言う縛りはありません。テキストラベル部品をピクチャボックスの外側につけるとか、そういう対応をした方がいいのでしょうか?
Zuishin

2016/06/14 02:19

スクロールしてはだめなものはスクロールしないところに置かなければいけません。 ビットマップの中だけですべて賄うならビットマップの一部だけをスクロールさせる処理を自分で作らなければなりませんが、そんな面倒くさいことをするよりは Label でも何でもあるものを使ったらいいじゃないですか。 まずは自分で実装して、困ったら具体的に質問してください。 それと、質問するのであれば、具体的な仕様、たとえば宿題であれば問題文があると思いますが、これを公開するのは必須です。 回答があった後で「これは仕様にそぐわないから却下」ということをしてはいけません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問