■14366 / ) |
Re[10]: パネル内の座標値、そして座標値の範囲を設定する |
□投稿者/ 魔界の仮面弁士 (631回)-(2008/02/16(Sat) 09:27:52)
|
2008/02/16(Sat) 09:48:12 編集(投稿者)
■No14361 (Tetsu さん) に返信 > では、このforループを使用している以上、再描画をしても私がやりたいことは達成できない、ということでしょうか。 単純修正では、forループを抜けた直後に、 xOne = 50.01f; などのように、元の値を設定しなおすだけで済むと思いますよ。
ただしそもそもは、xOne を使いまわしているのが問題なのだと思います。 「xOne の初期値」を取っておく変数と「描画用」の変数は分ける必要があるので、今回の場合は
private float xOneInit = 50.01f; : void panel2_Paint(object sender, PaintEventArgs e) { : float xOne = xOneInit; : for (int i = 0; i < 3; i++) { : myPoints[0] = new PointF(xOne, yOne); : e.Graphics.DrawLines(pen, myPoints); xOne += 200f; : } } のようにした方が良いでしょう。もちろん、xOne 以外の座標についても同様です。
> データベースから読んできたx,y座標を一つずつ使って折れ線を描くのですが、 その場合、Paint イベントの中で myPoints 配列を決定するのでは無く、 Paint イベントに入る前に、myPoints 配列を用意しておけばよいと思いますよ。 (xMin, yMin, xMax, yMax なども、Paint イベントの発生前に事前に計算しておく)
また、それらの描画座標(myPoints 配列等)が変更された場合には、 Invalidate を呼び出して、Paint イベントを再発生させると良いでしょう。
> ・Bitmapとして表示をするか(やじゅさんのコメントより) 描画内容が複雑であり、再描画に時間を要する場合などでは、その方法がおすすめです。
ただし、描画内容が頻繁に変化する場合には(心電図など)、Bitmap や Metafile を 用意するよりも、やはり Paint で描画した方が良いでしょう。 (変化の少ない部分だけを Bitmap として持ち、変化の多い部分を Paint で担当という手もあり)
また、現在の 1000x1000 という程度のキャンバスなら、デスクトップの壁紙程度のサイズなので さほど問題は無いですが、もしも巨大なキャンバスが必要な場合は、全体を一つの Bitmap として 表示させるという方法では、負荷が高いかも知れません。
> ・描画する前に座標を変換し、パネルの中に全ての座標が収まるようにし、スクロールが必要ないようにする 座標変換というと、このあたりですね。 http://msdn.microsoft.com/library/ja/cpguide/html/_gdiplus_Coordinate_Systems_and_Transformations_about.asp
現在のキャンバスである panel2 の Size は、1000, 1000 ですよね。 もしもそれに収まるなら、縮小のための座標変換は不要だと思います。
もし、1000,1000 では収まりきれないほどの内容を、縮小せずにスクロールで表現したいなら、 Panel 重ね合わせではなく、HScrollBar/VScrollBar コントロールとの組み合わせで、 表現するという方法もあります。 http://msdn2.microsoft.com/ja-jp/library/b2xw7sx1.aspx
|
|