ウィンドウプロシージャが動作の起点

これまで取り上げてきたとおり、ウィンドウクラスの作成がWindows APIを使ったウィンドウプログラミングの最初の一歩であり、ウィンドウクラスにはウィンドウプロシージャを登録する必要がある。

ウィンドウプロシージャは、ウィンドウに対してアクションが必要になった場合に起点となる関数である、ここに必要な処理を書いておく。今回はこの関数が実際に呼び出され処理されていることを確認するために、ウィンドウプロシージャで背景カラーをレンダリング処理を行った。

ウィンドウプロシージャは今後詳しく取り上げることになるが、すべての処理を自前で書くのは煩雑なので、実際にはDefWindowProc()というデフォルトで用意されている関数をコールするように実装する。自前で処理したい部分だけ処理を書いて、それ以外はDefWindowProc()に処理を流すといった方法だ。

こんな感じで詳しく見ていくと、Windows APIを使ったウィンドウプログラミングは本質的な仕組みはそれほど難しくないことがわかってくるのではないかと思う。

WNDCLASSW構造体メンバ、 ウィンドウクラススタイル一覧

WNDCLASSW構造体メンバ 内容
style UINT。ウィンドウクラススタイルを指定。OR演算で複数指定可能。
lpfnWndProc WNDPROC。ウィンドウプロシージャへのポインタ。先にウィンドウプロシージャを作成しておき、ここでポインタを登録する。実際にウィンドウが表示されてからの動作はこのウィンドウプロシージャで行われる。デフォルト関数としてはDefWindowProc()が用意されている。自前のウィンドウプロシージャで処理を自前で行わないものをDefWindowProc()へ流すといった使い方をする。
cbClsExtra int。確保したウィンドウクラス構造体のあとに何バイト分確保するかを指定。システムは確保した領域をゼロクリアする。
cbWndExtra int。確保したウィンドウインスタンスのあとに何バイト分確保するかを指定。システムは確保した領域をゼロクリアする。
hInstance クラスに対するウィンドウプロシージャを含んだインスタンスへのハンドラ。
hIcon HICON。クラスアイコンへのハンドラ。NULLの場合にはデフォルトアイコンを使用。
hCursor HCURSOR。クラスカーソルへのハンドラ。NULLを指定した場合には、アプリケーション側でマウスがアプリケーションウィンドウに入ってきたときに明示的にカーソル形状を指定する必要がある。
hbrBackground HBRUSH。クラスバックグラウンドブラシへのハンドラ。背景色などを指定する。色を指定する場合にはスタンダードシステムカラーのうちのどれか一つを指定する必要があり、かつ、値に1を追加したものを使用し、さらにHBRUSHへ変換して指定する必要がある。NULLを指定した場合にはクライアント領域で描画が要求されたときに自分で背景を描画する必要がる。描画の必要性はWM_ERASEBKGNDメッセージを処理するか、BeginPaint関数のPAINTSTRUCT構造体のfEraceメンバーで確認できる。
lpszMenuName LPCTSTR。リソースファイルに表示されるクラスメニューのリソース名。NULLが指定された場合、このクラスに属するウィンドウはデフォルトメニューを持たないことになる。
lpszClassName LPCTSTR。nullで終わる文字列へのポインタ。最大256文字。なるべく一意な文字列になるようにする。
ウィンドウクラススタイル 内容
CS_BYTEALIGNCLIENT ウィンドウクライアントエリアをバイトバウンダリに揃える(x方向)。ウィンドウの幅および水平方向の配置に影響する。
CS_BYTEALIGNWINDOW ウィンドウをバイトバウンダリに揃える(x方向)。ウィンドウの幅および水平方向の配置に影響する。
CS_CLASSDC クラスのすべてのウィンドウによって共有できる単一のデバイスコンテキストを割り当てる。ウィンドウクラスはプロセスに対して割り当てられるものなので、アプリケーションの複数のうレッドが同じクラスのウィンドウを作成することができる。同時に複数のスレッドが同じデバイスコンテキストを同時に使うことを試みることができる。その場合、システムはひとつのスレッドに対してのみ書き込み処理を成功裏に終わらせる。
CS_DBLCLKS クラスに属しているウィンドウの中でユーザがマウスのダブルクリックを行った場合ウィンドウプロシージャにダブルクリックメッセージを送信する。
CS_DROPSHADOW ウィンドウのドロップシャドー効果を有効化する。通常、この機能はメニューといった短命で小さく、ほかのウィンドウとのZオーダーを強調する目的で使われる。このスタイルのクラスから生成されたウィンドウはトップレベルウィンドウである必要がり、子ウィンドウにはならない。
CS_GLOBALCLASS ウィンドウクラスがアプリケーショングローバルクラスであることを指定。
CS_HREDRAW ウィンドウの移動やウィンドウクライアントエリアの幅が変更された場合にウィンドウ全体を再描画することを指定。
CS_NOCLOSE ウィンドウメニューの「終了」機能を無効化する。
CS_OWNDC クラスのそれぞれのウィンドウにそれぞれユニークなデバイスコンテキストを割り当てる。
CS_SAVEBITS クラスのウィンドウによって隠された部分のイメージをビットマップとして保存する。ウィンドウが削除されると保存されたビットマップを使用して隠されたほかのウィンドウを含む画面イメージを復元する(WM_PAINTメッセージは送信されなくなる)。このスタイルはメニューやダイアログボックスといった一時的に表示され、かつ、ほかの画面の動作が行われる前に削除されるウィンドウをう買う場合に便利。なお、ビットマップを格納うるためにメモリ割当が行われるようになるため、ウィンドウの表示に必要な時間は長くかかるようになる。
CS_VREDRAW ウィンドウの移動やウィンドウクライアントエリアの高さが変更された場合にウィンドウ全体を再描画することを指定。
マウスカーソル 内容
IDC_APPSTARTING 矢印と砂時計
IDC_ARROW 矢印
IDC_CROSS 十字
IDC_HAND
IDC_HELP 矢印と?
IDC_IBEAM Iビーム
IDC_NO スラッシュサークル
IDC_SIZEALL 東西南北矢印
IDC_SIZENESW 北東と南西の二重矢印
IDC_SIZENS 南北の二重矢印
IDC_SIZENWSE 北西と南東の二重矢印
IDC_SIZEWE 西と東の二重矢印
IDC_UPARROW 垂直矢印
IDC_WAIT 砂時計
システムカラー 内容
COLOR_ACTIVECAPTION アクティブウィンドウのタイトルバーの色
COLOR_APPWORKSPACE マルチドキュメントインターフェースアプリケーションの背景色
COLOR_BTNTEXT プッシュボタンテキストの色
COLOR_GRAYTEXT 灰色テキストの色
COLOR_HIGHLIGHT コントロール内で選択された項目の色。
COLOR_HIGHLIGHTTEXT コントロール内で選択された項目のテキストの色。
COLOR_WINDOW ウィンドウの背景の色。前景色はCOLOR_WINDOWTEXT。
COLOR_WINDOWTEXT ウィンドウ内のテキストの色。背景色はCOLOR_WINDOW。