ウィンドウプロシージャが動作の起点
これまで取り上げてきたとおり、ウィンドウクラスの作成が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。 |
- Module 1. Your First Windows Program - Win32 apps | Microsoft Docs
- WNDCLASSA (winuser.h) - Win32 apps | Microsoft Docs
- Window Class Styles (Winuser.h) - Win32 apps | Microsoft Docs
- LoadCursorA function (winuser.h) - Win32 apps | Microsoft Docs
- GetSysColor function (winuser.h) - Win32 apps | Microsoft Docs