テクニカルレシピ(Visual C++のレシピ)

Home>>Visual C++>>ダメアプリを知る LastUpdate:2009-01-21

GUIの定石

Visual C++の機能は非常に膨大です。
そのため必要な機能は必要な時に憶えていけばいいのですが、
GUIを洗練させるにはある程度決まった定石があります。

初心者を脱したい方はこの定石をしっかり理解してください。
解説には下のサンプルアプリを使います。
(ソースファイルはサンプルコードのtips0.zipにまとめています。)

このアプリは「Start」ボタンを押すと、
赤い丸(○)と青い四角(□)が500個ずつ表示されるシンプルなものです。

表示は「描画回数」だけ行われ、丸と四角の位置は描画のたびにランダムに変化します。
進行状況は左上の「描画回数:*回目」という部分でわかるようになっています。
途中で「Stop」ボタンを押すと描画が終了します。

ダメアプリ

コントロール変数については、
Edit Control(描画回数)にはint型の「m_num」という変数、
Picture Box(描画のキャンパス)にはCStatic型の「m_pict」という変数を設定しています。

Buttonは2つあり、まずStartボタンのイベントハンドラ関数を下に示します。
普通にm_pictからデバイスコンテキストを取得し、m_num回だけ描画を繰り返しています。
また途中で「m_stop」という変数がTRUEになったらループを抜けるようにしています。

Stopボタンのイベントハンドラ関数はシンプルです。
「m_stop」という変数をTRUEにして、描画ループを抜けさせます。

このアプリ、一見何も問題ないように見えますし実際に動作もします。
しかしこのアプリには4つの問題が潜んでいます。

@レイアウトが固定的

このアプリはレイアウトが固定されています。
そのため画面を最大化しても描画領域が変化しません。

サイズが固定的なアプリケーションならいいですが、
サイズが変更する場合には動的レイアウト処理が必要です。

A再描画されない

このアプリはStartボタンを押したときしか描画処理が行われません。
そのため他のアプリケーションのウィンドウが一度重なり、
再度このアプリを表示するような場合でも再描画が行われません。

適切な再描画処理が必要です。

B画面がちらつく

この問題は実際にアプリを実行しないとわからないのですが、
このままでは描画の際に画面表示がちらつきます(チカチカします)。
また「描画回数:*回目」という表示も、最後の描画が終わるまで見えないはずです。

一般に描画処理の負荷は高いので、
本アプリのように多数の図形を連続して書くと表示が乱れてしまうのです。

そのため描画対象が複雑でも
スムーズな表示がされるようにちらつき防止が必要です。

C操作不能

この問題も実際にアプリを実行しないとわからないのですが、
実はこのアプリは「Stop」ボタンで停止させることが出来ません。

正確に言うと「Start」ボタンを押してから描画が終了するまで、
画面を最大化することもアプリを終了することもできません。
まさにフリーズ状態になってしまいます。

前述のように描画処理の負荷は高いので、
描画処理に注力するあまり、
クリック等の入力に反応することが出来なくなってしまうのです。

どんなに負荷が高いアプリであっても、
実行中に外部から操作ができるようフリーズ防止が必要です。

順番に解決

本サイトでは@-Cについて順番に解決していくので、
左メニューの上から順に読んでいって下さい。

シングルDocument:前項<< ページの先頭に戻る >>次項:動的レイアウト


このエントリーをはてなブックマークに追加