VB6.0で開発をしています。
多くのコントロールを含んだフォームが複数あり、
画面遷移の際にコントロールが描画されるのが
見えてしまいます。
全コントロールを読み込んだ後、表示する作りに
したいのですが。
ちらつきを回避する方法について教えてください。
新しいフォームをLoadした後、タイマーでそのフォームを
少し遅らせて、表示したらいかがでしょうか。
Load処理が終わらずに画面表示しているということ
なのでしょうか?
一時的にフォームを非表示にするということでは?
非表示にするということは、メモリ上はどうなるのでしょうか?
皆さん、ちらつきは発生していませんか?
「ちらつき」と言うのをもっと詳しく説明して下さい。
画面の切り替わりが遅かったり、部分的に前の画像が
残ったりするのは、ビデオチップやビデオカードの性能に
依存する場合が殆どで、ハードを変えるほかに解決方法は
有りません。
エディターでコントロールを置かずに、コードでコントロールを
Loadしておりその過程が見えてしまう場合や、
FormのLoad時にコントロールの大きさや位置をコードで
指定しており、その過程が見えてしまう場合は、
Load Form2
DoEvents
Form2.Visible = True
などとしてLoadしてから表示すれば位置が定まってから表示されます。
FormのLoad時に大量のデーターの読み込みが完了しないと、コントロールの
位置や色が決定出来なかったり、読み込みながら,コントロールの位置や
大きさを変える場合は、読み込みが完了するまで、そのフォームを表示せずに
経過を表示する別の画面を見せたりします。
タイマーを使用する場合もあります。
>非表示にするということは、メモリ上はどうなるのでしょうか?
表示を言うのはメモリーに読み込むことでは無く、ビデオドライバーに
表示情報を渡すことです。
通常のメモリーとビデオ・メモリーを混同されていませんか。
×表示を言うのは
〇表示と言うのは
「ちらつき」とは、前の画面がみえたり、
Windowsの起動後初期画面がみえたりします。
また、読み込み時に使用可または不可の設定、画面クリアを
行っているのみです。
どーゆーコントロールでどーゆーデータを表示するとき画面がちらつく
のかを示さないと的確な解答は出来ないですよ。データ処理で重いのか、
再描画命令(DoEvents 等)自体が多いのか判断できません。
ちらつき?を少なくするには、
・描画するアイテム数を少なくする。
・一度描画したアイテムは変化があるまで再描画しない。
・一部変化ならその部分だけ書き換える。
・描画面と表示面を使いわける。
・描画タイミングを微妙にずらす。
要するに古典的手法ですが、ダブルバッファと部分書き換えです。
部分書き換えが威力を発揮するのは、スクロール系の描画。
ダブルバッファはちらつきを少なくするため、BitBlt を多用します。
BitBlt でもちらつきが許容範囲を超えているなら、垂直帰線割り込み?
とかを検討すると良いです。WindowsでVSYNCハンドリングできるのかは
不明ですが。VSYNC 発生中の1/60 秒以内に全ての画面描画処理を済ませれ
ばほぼちらつきが消えます。BitBlt が 10ms くらい?、表示面切り替え
が ナノ秒レベルなので、通常の人間の目では切り替わった瞬間を目で
追うことは不可能に近いです。たぶん。但し、表示面切り替えは、
グラフィックボード専用命令をたたく必要があるので、実装カード依存
です。
★リストコントロールには遅延描画専用のロジックが組み込まれています。
# VBでも出来るのかどうかは知りませんが。
例えば、縦に10行表示できるが、実データが100万件あるとき、
通常のコントロールだと、100万件登録完了するまで画面の描画が
されません。ですが、この遅延機能を使うと、10行分のデータだけ
描画して、あとは画面の再描画契機の操作が掛かるまでデータを取得
する動作が保留されます。リストの場合は、次のデータが見たい、と
いう操作は、スクロールですから、スクロールイベントが発生すると、
コントロール内部から自動的にデータ取得専用イベントが呼び出され
ます。実装者は、この専用イベントを実装するだけで誰でも簡単に、
データ総量に依存しないリストを使うことができるようになっています。
ちらつきの主要因がリスト系なら、遅延描画を組み込むことも検討して
みてください。
”ちらつき”はアプリの起動時やフォームの切り替え時に出るのですね。
Form1.Visible = False
などとした時、Form1の消えていく過程が見えると言った経験は有りません。
もしこの状態だとすると、マシンスペックが相当に低い可能性が有ります。
Form1を非表示にせずに、Form1の上にForm2を表示する場合で、その過程で、
Form1が見えたり、Form2のコントロールが正規の場所ではない場所に見える場合は、
いきなり Form2.Visible = True とせずに Load Form2 を行った後に 、
Form2.Visible = True とします。
これでもまだ見えてしまう場合は、Load Form2後にタイマーを設定して、適当な
時間を置いてからForm2.Visible = Trueとします。
この時間が長くて待てない場合は、プログレスバーなどを表示することにより、
間を繕います。
VBのEXE起動時に起動画面が見えてしまう場合は、プログラムのスタートアップを
Formに設定するのではなく、Moduleに設定して、フォームがロードされてから表示します。
これでも見えてしまう場合は、ソフトウェアータイマーを作成して、ロード後しばらくして
フォームを表示します。この時間が長くて待てないを言う場合は、スタートアップフォームを
作成して、メインフォームが立ち上がるまでスタートアップフォームを表示して間を繕います。
スタートアップフォームを使用する場合は、プログラムをModuleから立ち上げる必要は
有りません。
いずれにしろ創意と工夫により、見苦しい画面はほ殆ど出なくなると思います。
フォームの切り替え時に発生します。
Windowsデスクトップ画面がみえます。
例えば、Form1を閉じてForm2を表示する場合、
(どちらも全画面表示)
Load Form2した後にUnload Form1
そしてShow Form2しています。
Form2.visible = trueとShow Form2とは
どう違うのでしょうか?
教えてください。
ツイート | ![]() |