• 締切済み

アプリケーションについて

今晩は。早速ですがアプリケーションについて幾つか質問があります。よろしくお願いします。環境はBorland C++Builder5です。 普段のForm上の画面を青として、PaintBoxを白で表示させたとします。これは、別に何の問題もないんですが、Formを最小化したりすると出力した画面が消えてしまうんです。(PaintBox画面が消えて?元の青になってしまうということです)ただ、画面上は青になってしまいますが、PaintBoxに出力させた座標などのデータは残っているようです。web上にあるjavaのアプレットなどは、画面を最小化してもそのまま残っているのですが、C++BuilderのPaintBoxはFormを最小化したりすると消えてしまう仕様なのでしょうか? また、PaintBoxの座標をデータに合わせて縮小したり拡大したり出来ないのでしょうか?私の使っているパソコンの画面は15型なので、1000*1000程度の座標しか扱えません。 座標データが0~100程度のものもあれば0~10000といったものもたくさんあります。0~100程度の座標であればPaintBox上には座標がありますが、左端に小さくよっていて、非常に不細工です。また、0~10000の座標であれば画面に映りません。データに合わせて座標の幅を縮小したり拡大できないものでしょうか?矢張り、データ自体の方を縮小したり拡大したりといった作業をする必要があるのでしょうか?(そうすると、都市(点)が多くて座標が大きい場合、データを縮小すると点が重なり合って、非常に見辛いです。) あと、画面の大きさに合わせてPaintBoxやなどの大きさも大きくしたり小さくしたり出来ないのでしょうか?例えば、17型の画面で15型の画面で作ったものを動かしたら、当然ですが15型の画面が表示がされます。それを最大化するとFormだけが最大化されてPaintBoxなどはもとの15型のままです。Formの大きさに合わせてPaintBoxなども大きくしたり小さくしたりすることは可能でしょうか?

みんなの回答

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.5

>座標とpixelのマッピング これは、ただ単に全ての点を打つのに必要な座標平面の範囲が縦横とも0-500だとして、 描画コントロールのサイズが縦横250なら座標も点の大きさも0.5倍してプロット、 描画コントロールのサイズが縦横1000なら座標も点の大きさも2倍してプロット、 そうすればきれいに収まるなぁ、という単純な意味です。 必要な座標平面の範囲とコントロールのサイズを取得して適当な比率を算出するだけです。 >Imageを使うと途中の処理が一切表示されなくなってしまうのです。 >点が打たれる過程などは一切必要ないです。 えー、どっちなんでしょう?  A:描画コントロール上に1つ1つ点を打ちそのたびごとに表示  B:全ての点をコントロール上に一括表示でよし どっちにするかで全く話が変わります。 Aは、Image->Repaint() で間に合うかもしれませんが、Timerを使う方が適切です。

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.4

ややこしいので順に行きましょう。 1.TPaintBoxとTImage TImageの方が重いのは確かですが、動画のようなリアルタイムが要求されるようなシビアな処理でない限り、今時のPCなら大抵のことはTImageを使っても大丈夫だと思いますが。 まずはTImageを使い開発し、それでは処理が追いつかないと判ったところでTPaintBoxに切り替えても良いように思います。 2.座標点のプロット 方法その壱。 TImageなりTPaintBoxの描画コントロールが管理する描画オブジェクト(Canvas)に直接書きこむ。   座標とpixelのマッピングはコーディングが必要。   TImageは多少遅くなる。 方法その弐 TBitmapなどの非表示オブジェクトを用意し、そこにまず点を描画する。 そしてそれをTImageなりTPaintBoxの描画コントロールに渡して表示させる。   マッピングはコントロールに任せることも可能。→StretchDraw(), Stretchなどを使う   点を打ち終わってから表示するならTImageのオーバーヘッドも問題にならないはず。   TPaintBoxでも再描画の手間を考えるとこっちの方が面倒が少ないかもしれない。 どちらの方法でも、点を打つくらいならTImageを使っても実用上問題にならないような気がします。死ぬほど点の数が多ければ話は別ですが。 ただ、もし1つ1つ点が打たれる過程を表示したいなら、また別の手を考える必要があります。 3.WindowsAPI(WM_PAINTとかGetObjectとか) BCBでも当然WindowsAPIを直接扱うことは出来ます。 ただ今回の質問とは関係ないですね。

revolution_2005
質問者

お礼

おはようございます。早速有難うございます。 1.Imageを使うと途中の処理が一切表示されなくなってしまうのです。IncrementalDisplayをtrueにしても変わりませんでした。処理が早すぎるのかとも思い、sleepを使って遅くしてみましたが駄目でした。イメージとしては下記のURLのような表示を今PaintBoxで行っています。 http://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/demo/TSP/index4.html 因みに、扱う点の数は4~1000程度です。 2.方法その壱の、コーディングとはどのようにやるのでしょうか?helpのpixelのところを見ても何も書いていないようなので困っています。その弐だと、Imageが途中描画をしてくれるのならStretchを使えるので楽そうなのですが。点が打たれる過程などは一切必要ないです。 3.そうなんですか。学校でcについて多少習った程度なので、正直WindowsAPIなどの知識は一切ないです。失礼しました。

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.3

補足。画像回りはめったに使わないので忘れてました(苦笑。 TImageであればProportional、Stretchのプロパティがあります。 Proportional:縦横比を保存して自動的に縮小。ただし拡大はしない。 Stretch:縦横比無視で自動的に拡大縮小。

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.2

>C++BuilderのPaintBoxはFormを最小化したりすると消えてしまう仕様なのでしょうか? そのような仕様です(といいますか、これはもともとWindowsの仕様なのです)。 TPaintBoxは(最小化されていたり他のウインドウに隠されていた)ウインドウを再表示するときは明示的に再描画する必要があります。OnPaintイベントを使います。 ただ、通常はTImageの方を使います。こちらは自動的にイメージをバッファリングし、再表示のときにも自動的に再描画してくれます。 ただし、その分、動作が重いです。普通は気にする必要ありませんが、ゲームのような頻繁にイメージの書換えがおきるアプリケーションでは動作の軽いTPaintBoxをつかい、その代わり再表示時の再描画も自前でコーディングするわけです。 >データに合わせて座標の幅を縮小したり拡大できないものでしょうか? 単純に画像をTPaintBoxなりTImageの大きさにあわせて拡大縮小したいならTCanvas::StretchDraw()が使えますが、縦横比を保存したまま拡大縮小したいならそのようにコードを書く必要があります。 >あと、画面の大きさに合わせてPaintBoxやなどの大きさも大きくしたり小さくしたり出来ないのでしょうか? 可能です。AlignプロパティをalClientに指定します。

revolution_2005
質問者

お礼

返事が遅くなって申し訳ありません。いつも丁寧に答えてくださって有難う御座います。Imageの方は早速使ってみました。途中描画は凄く重そうなので、最後の出力時にPaintBoxを消してImageで出力することにしました。 2番目の質問なのですが、文字数制限により言葉足らずでした。bmpなどの画像を出力したいのではなく、txtファイルの座標を読み込んで出力したいのです。例えば、 0 3 2 5 4 1 6 5 3 9 などといった感じのtxtファイルです。この場合、txtは最大10*10で収まってしまうので、1000*1000の座標の場合凄く左上にポツンとした座標になってしまいます。1pixelあたりの幅を変えることによって、1000*1000の座標を10*10などとtxtファイルを読み込んだときに、txtファイル中の最大値に合わせて自動的にpixelの幅を変更し、描画出来ないかと思ったのです。(もしかしたら、もうそのことを回答してくれているのに、私の理解不足から勘違いをしているのかもしれません。それでしたら申し訳ありません。一応stretchなどをtrueにしたりして試してみたのですが何も変更されなかったもので・・・。)

noname#16765
noname#16765
回答No.1

最初に言っときますが、わたしはCでのアプリケーションは初心者なので間違ったことをいうかもしれません。 そのときはすみません。 とりあえず私も画像表示プログラムを書きましたが普通に最小化なども普通にいけました。 ですのでCで最小化などはいけると思います。 もしかしてWM_PAINTとかの使い方が間違っているとか・・・? >データに合わせて座標の幅を縮小したり・・・ やったことがないのですが・・・、GetObjectで画像のサイズを取得してから座標の幅を変更できるのでは? >17型の画面で15型の画面で作ったものを動かしたら・・・ そうなんですか!知りませんでした・・・ サイズ指定をCW_USEDEFAULTとかにした場合もそうなんですか?

revolution_2005
質問者

お礼

返事が遅くなってしまい申し訳ありません。WM_PAINTなど調べてみましたが、どうもborland c++Builderでは使えないようです。とはいえ、親切に教えてくださり有難う御座いました。

専門家に質問してみよう