フォームにグラフィックを描画出来るようにしました、最小化した後に また表示すると また最初から描画されてしまいます。最小化して戻した時も描画されているようにしたいのですが。どうしたらいいですか。お願いします。
最小化することによりグラフィックメモリから消去(退避)されます。
もとにもどすにはグラフィックメモリに再配置される必要がありますから
退避領域からのブロック転送、即ち再描画されるのは当然と思いますが・・・.
「もとに戻さずにもとに戻す」ことはできません。
どうすればいいでしょうか。方法はあるのでしょうか。
どうしたいのでしょう?
最小化しても画面上に絵が残っているようにしたいのですか?
グラフィックはフォームに㊧から㊨へ描画されるようにしたんです。
例えば描画途中で最小化しますよね、最小化している時も目には見えないけど描画途中から続いて㊨へ描画されていてほしい。そして、もう一度、フォームを表示させるとその分、描かれているようにしたいです。
今のままだと、途中まで描画されていても最小化して元に戻したらまた左から描画開始されてしまう。
始めに戻ってしまうんです。解決したいです。
イメージを伝えるのが下手糞ですみません。
丸のついた文字は、機種依存文字ですから、使わないでくださいね。
ここではあんまり意味を成さないかもしれませんけど…。
> グラフィックはフォームに㊧から㊨へ描画されるようにしたんです。
うーん、わたしなら、オフスクリーンビットマップを使いますけど。
名のとおり、表示されないビットマップです。
CreateBitmapなどのAPIを使って作るそうですが、よくわからないです(^^ゞ
やる場合は、ご自分で調べてください(^^ゞ
オフスクリーンビットマップに描いて、
それを適度にBitbltで貼り付けていけば、
再描画しようとしまいと関係はないと思いますけど。
(このばあい、再描画するとかえって機能低下になるかも)
通常は最小化している最中も描画を続けているはずですが…。
見えてないほうが速いので、最小化中に描画が終了したり
することもあります。
AutoRedraw = Falseにしているとか、
Form_Activateイベントに描画関数置いてると
いうことはありませんか?
form1でResizeを使っています。
form1でResizeを使っています。
form1_Resizeに描画関数を置いたら、
Formの大きさを変えるたびに描画してしまいます。
Resizeで一度だけ描かせたいなら、
モジュールレベルで
Private lngFlg As Long
Form_Loadで
lngFlg = 0
Form_Resizeで
If lngFlg = 0 Then
lngFlg = 1
描画関数
End If
とでもしてください。
Formなど目に見える部分に直接描画するのであれば、Sayさんが言っているようにAutoRedrawプロパティをTrueにしてメモリ領域によって画像が保持されるようにすれば良いと思います。これをFalseにしておくと、その描画領域であるFormなどが隠れてもう一度現れたときに描画が無駄になってしまいます。
それと、描画処理をPaintイベントやResizeイベントに置く場合は、描画中かどうかを確認し、描画が完了していないのに再描画するということを防ぐ必要があると思います。
でも、こういった動作をさせるときは普通はたかみちえさんが言っているように、目に見えない領域で描画処理を行い、PaintイベントやResizeイベントで再描画が必要なときにはその画像を目に見える領域に転送します。描画処理と再描画の処理を別々にするという感じです。
これはダブルバッファリングといってゲーム作成に良く使われる技法で、描画のちらつきをなくしたり、無駄な描画を省くことができます。
ベンチマークソフトの3DMark2001を使うとわかるのですが、トリプルバッファリングなんていうのもあります。
ツイート | ![]() |