C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 31 を表示中)
■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
返信 編集キー/


管理者用

- Child Tree -