「Windows API」の版間の差分

編集の要約なし
(→‎イベントドリブン方式: Win32APIプログラミングでは、いわゆる「無限ループ」をプログラマーが新規に書くことは、通常、ありません。もし、無理やり書いても、動作が遅くなったり、バグの原因になります。 Visual Studio での Win32APIのテンプレート作成時に、アプリを終了させないための無限ループのようなものが、すでに書かれているので、通常は、そのテンプレートを流用します。)
 
== イベントドリブン方式 ==
 
Win32APIのプログラムの実行順序は、ユーザーの操作によって変わります。
 
Win32APIのプログラムの実行方式はイベントドリブン方式です。
 
なお、(グローバル変数の宣言などの例外を除くと、)プログラム中のなんらかの処理は、ほとんどが、なんらかのイベントと関連づけられます。
 
 
 
もし、「操作に関わらず常に何度も実行させたい処理を書きたい」と思っても、そういう処理は書けません。'''仮にアナタが「C言語のコンソールアプリのmain関数のように、特定の関数に依存しない処理を書こう」と思っても、Win32APIにそういう関数はないの'''です。
* 中枢の関数は無い
もし、「操作に関わらず常に何度も実行させたい処理を書きたい」と思っても、そういう処理は書けません。'''仮にアナタが「C言語のコンソールアプリのmain関数のように、特定の関数に依存しない処理を書こう」と思っても、Win32APIで書くプログラムは、そういう中枢の関数は'''です。
 
wWinMain 関数のブロックは、単に、Win32APIアプリの開始時点をあらわすブロックにすぎず、アプリ起動時に1回だけ実行されるプログラムにすぎません。
 
 
 
Win32APIでは、キーボード操作とは無関係にアプリ起動時に1回だけ実行する処理というのは書けますが、それだって、「アプリ起動」というイベントによって駆動されたプログラムです。
 
 
基本的にOSは、利用者の操作のないときにはメモリを休止させる必要があるので、キーボードの操作の後に必要になる処理も、<code> case WM_KEYDOWN: </code>のブロックに一緒に書くことになります。
 
このため、キーボードの操作以外の処理もまた、<code> case WM_KEYDOWN: </code>のブロックに書くことになります。
 
つまり、イベントの詳細の定義と、イベント発生後に行う処理を、一緒に書くことになります。
 
 
つまり、* イベントの詳細の定義と、イベント発生後に行う処理は、通常、一緒に書くことになります。かれる
キーボード操作イベントにかぎらず、基本的にwin32APIプログラムでは、たいてい、あるイベントの詳細の定義と、そのイベント発生後に行う処理を、一緒に書く場合になることが、ほとんどです。
 
たとえば、キーボード操作イベントの処理は、どのキーが押されたかというイベントと、キーが押された後に行う処理とを、一緒のブロックに書きます。
 
 
 
 
 
* もし中枢のブロックが必要な場合、何かのイベントのブロックを流用する
もし、どうしても、プログラム全体を管理したいブロックが欲しい場合、アプリ起動中に何度も発生するイベントの処理を書くブロックを流用します。
 
キーボード操作イベント(WM_KETDOWN)や、時間経過イベント(WM_TIMER)など、何度でも発生できるイベントのブロックを流用して、そのブロック内に、目的の、プログラム管理的な処理を書くことになります。
 
 
このため、一見すると、そのイベントとは関係なさそうな、管理的な処理も、何らかのイベント発生後処理のブロックに書かれることも、あります。
 
 
このため、他人の書いたプログラムを読む際に、一見するとキーボード操作とは関係なさそうな処理でも、キーボード操作のブロックに処理が書かれている場合があります。
 
また、上記のような都合のため、書かれたプログラムではキーボード操作のブロックは長くなりがちなので、プログラムの全体像が分かりづらくなるので、もし複数人で共同開発する際には、あらかじめ仕様書などを作っておき、その仕様書でシステムの概要を説明しておき、全体像を把握しやすくすべきでしょう。
 
 
 
* タイマー機能
なお、タイマー機能のある <code> case WM_TIMER: </code>のブロックを追加したり SetTimer というコマンドを使い、「一定の秒数が経過したら○○を実行する」というタイマーのイベントを宣言することにより、キーボード操作とは無関係に自動的な処理を書くこともできます。しかし、これだって「○○秒の経過」というイベントによって駆動されるプログラムにすぎません。
 
 
 
* 無限ループは書かない
なお、Win32APIプログラミングでは、いわゆる「無限ループ」をプログラマーが新規に書くことは、通常、ありません。もし、無理やり書いても、動作が遅くなったり、バグの原因になります。
 
20,150

回編集