APIを使用したWindow作成の基礎知識
ここでは、APIを使用して独自のウィンドウを作成するための基本的な手順を示します。
手順:
1.RegisterWindowEx()でウィンドウ・プロシジャーとウィンドウ・クラスを登録
2.CreateWindow() または、CreateWindowEx()で作成
3.DestroyWindow() または、DefWindowProc()へのWM_CLOSEメッセージ送信でウィンドウを破棄
解説:
1. RegisterWindowEx()でウィンドウ・プロシジャーとウィンドウ・クラスを登録
【ウィンドウ・プロシジャー】
ウィンドウ・プロシジャーとは、Windowへ送られる標準的なメッセージを処理してくれる
非常に便利な機能です。
ウィンドウ・プロシジャーには、CALLBACK関数とAPIの以下の二つがあります。
[CALLBACK]
LRESULT CALLBACK WindowProc(
HWND hWnd,
UNIT uMsg,
WPARAM wParam,
LPARAM lParam
);
[API]
LRESULT DefWindowProc()
HWND hWnd, //メッセージを受け取ったウィンドウプロシージャのハンドルを指定
UNIT uMsg, //メッセージを指定
WPARAM wParam, //メッセージの追加情報を指定します。意味は Msg パラメータの値により異なります。
LPARAM lParam //メッセージの追加情報を指定します。意味は Msg パラメータの値により異なります。
);
【ウィンドウ・クラス】
作成するウィンドウの動作やアイコンのハンドルなどをここで規定します。
従って、CreateWindow()でウィンドウを作成する前に必ずウィンドウ・クラスを
登録する必要があります。
【ウィンドウ・プロシジャーとウィンドウ・クラスの登録】
登録には、APIのRegisterClassEx() を使用します。
ATOM RegisterClassEx ( CONST WNDCLASSEX *lpwcx );
【WNDCLASSEX構造体】
| UNIT | cbSize | sizeof (WNDCLASSEX) |
|---|---|---|
| UNIT | style | ウィンドウ・クラスのスタイル |
| WNDPROC | lptnWndProc | ウィンドウ・プロシジャー。省略不可 |
| int | cbClsExtra | ウィンドウ・クラスへ追加メモリの割り当て。0 設定可能 |
| int | cbWndExtra | ウィンドウへ追加メモリの割り当て。0 設定可能 |
| HINSTANCE | hInstance | ウィンドウ・プロシジャーのモジュール・インスタンス |
| HICON | hIcon | アイコンのハンドル。NULL設定可能 |
| HCURSOR | hCursor | カーソルのハンドル。NULL設定可能 |
| HBRUSH | hbrBackground | 背景色。NULL設定可能 |
| LPCTSTR | lpszMenuName | メニュー・リソース名。NULL設定可能 |
| LPCTSTR | lpszClassName | クラス名。省略不可 |
| HICON | hIconSm | 小さいアイコンのハンドル。NULL設定可能 |
| Style | 内容 |
|---|---|
| CS_BYTEALIGNCLIENT | ウィンドウのクライアントエリアの幅と水平位置の調整 |
| CS_BYTEALIGNWINDOW | ウィンドウの幅と水平位置の調整 |
| CS_CLASSDC | クラス中のすべてのウィンドウに共通のデバイスを割り当てる |
| CS_DBLCLKS | ダブルクリックメッセージをウィンドウに送る。 |
| CS_GLOBALCLASS | グローバル・ウィンドウ・クラス(レジストリ使用) |
| CS_HREDRAW | クライアントエリアの幅を変更した時、全体のウィンドウを再描画 |
| CS_NOCLOSE | ウィンドウメニューの上の終了を使用不可 |
| CS_OWNDC | ユニークなデバイスをの各ウィンドウに割り当てます |
| CS_PARENTDC | 親ウィンドウに子ウィンドウのクリッピング地域を設定 |
| CS_SAVEBITS | スクリーンイメージのビットマップを保持し、Windowが取り去られた場所へ保持したビットマップを再表示 |
| CS_VREDRAW | クライアントエリアの高さを変更した時、全体のウィンドウを再描画 |
| ハンドル | ブラシ |
|---|---|
| COLOR_3DDKSHADOW | 3D オブジェクトの暗い影の色 |
| COLOR_3DFACE COLOR_BTNFACE | 3D オブジェクトの表面色 |
| COLOR_3DHILIGHT COLOR_3DHIGHLIGHT COLOR_BTNHILIGHT COLOR_BTNHIGHLIGHT | 3D オブジェクトの最も明るい色 (光源方向の縁用) |
| COLOR_3DSHADOW COLOR_BTNSHADOW | 3D オブジェクトの影の色 (光源の反対方向の縁用) |
| COLOR_ACTIVEBORDER | アクティブウィンドウの境界の色 |
| COLOR_ACTIVECAPTION | アクティブウィンドウのタイトルバーの色 |
| COLOR_APPWORKSPACE | マルチドキュメントインターフェイス (MDI) アプリケーションの背景色 |
| COLOR_BACKGROUND COLOR_DESKTOP | デスクトップの色 |
| COLOR_BTNTEXT | プッシュボタンのテキストの色 |
| COLOR_CAPTIONTEXT | アクティブウィンドウのタイトルバーのテキストの色 |
| COLOR_GRAYTEXT | 淡色状態 (無効状態) のテキストの色 |
| COLOR_HIGHLIGHT | コントロール内における選択された項目の色 |
| COLOR_HIGHLIGHTTEXT | コントロール内における選択された項目のテキストの色 |
| COLOR_INACTIVEBORDER | 非アクティブウィンドウの境界色 |
| COLOR_INACTIVECAPTION | 非アクティブウィンドウのタイトルバーのテキストの色 |
| COLOR_INFOBK | ツールチップコントロールの背景色 |
| COLOR_INFOTEXT | ツールチップコントロールのテキストの色 |
| COLOR_MENU | メニューの背景色 |
| COLOR_MENUTEXT | メニュー内のテキストの色 |
| COLOR_SCROLLBAR | スクロールバーの軸の色 |
| COLOR_WINDOW | ウィンドウの背景色 |
| COLOR_WINDOWFRAME | ウィンドウの枠の色 |
| COLOR_WINDOWTEXT | ウィンドウ内のテキストの色 |
| dwExStyle | 内容 |
|---|---|
| WS_EX_ACCEPTFILES | ドラッグアンドドロップで、ファイルを受け入れます。 |
| WS_EX_APPWINDOW | ウィンドウが最小化されると、トップレベルウィンドウがタスクバー上に置かれます。 |
| WS_EX_CLIENTEDGE | 縁が沈んで見える境界線を持つウィンドウを指定します。 |
| WS_EX_CONTEXTHELP | ダイアログボックスのタイトルバーに[?]ボタンを追加します。ユーザーがこの[?]ボタンをクリックすると、マウスポインタに疑問符が付きます。その後、ユーザーがダイアログボックス内のコントロールをクリックすると、コントロールは WM_HELP メッセージを受け取ります。コントロールはダイアログの処理にそのメッセージを送ります。このダイアログの処理は、HELP_WM_HELP コマンドを使った WinHelp 関数です。ヘルプアプリケーションは、通常、コントロールのヘルプを持つポップアップウィンドウを表示します。WS_EX_CONTEXTHELP は WS_MAXIMIZEBOX スタイルや WS_MINIMIZEBOX スタイルとは一緒に使用できません。 |
| WS_EX_CONTROLPARENT | ユーザーが[Tab]キーを使って子ウィンドウ間を移動できるようにします。 |
| WS_EX_DLGMODALFRAME | 二重の境界線を持つウィンドウを作成します。dwStyle パラメータに WS_CAPTION スタイルを指定することで、タイトルバーを持つようにも作成できます。 |
| WS_EX_LEFT | 左揃えされたプロパティを持つウィンドウを作成します。デフォルトです。 |
| WS_EX_LEFTSCROLLBAR | 垂直スクロールバーがクライアント領域の左側に置かれます。ヘブライ語やアラビア語をサポートしているシステムで有効です。他の言語では、このスタイルは無視され、エラーとして扱われます。 |
| WS_EX_LTRREADING | 垂直スクロールバーがクライアント領域の左側に置かれます。ヘブライ語やアラビア語をサポートしているシステムで有効です。他の言語では、このスタイルは無視され、エラーとして扱われます。 |
| WS_EX_MDICHILD | MDI 子ウィンドウを作成します。 |
| WS_EX_NOPARENTNOTIFY | このスタイルで作成された子ウィンドウが作成されたり破棄されたりするときに、その親ウィンドウにWM_PARENTNOTIFY メッセージを送らないように指定します。 |
| WS_EX_OVERLAPPEDWINDOW | WS_EX_CLIENTEDGE スタイルと WS_EX_WINDOWEDGE スタイルの組み合わせです。 |
| WS_EX_PALETTEWINDOW | WS_EX_WINDOWEDGE スタイル、WS_EX_TOOLWINDOW スタイル、WS_EX_TOPMOST スタイルの組み合わせです。 |
| WS_EX_RIGHT | 右揃えされたプロパティを持つウィンドウを作成します。ヘブライ語やアラビア語をサポートしているシステムで有効です。他の言語では、このスタイルは無視され、エラーとして扱われます。 |
| WS_EX_RIGHTSCROLLBAR | 垂直スクロールバーがクライアント領域の右側に置かれます。デフォルトです。 |
| WS_EX_RTLREADING | 右から左への読み取り順序を持つプロパティを持ったウィンドウを作成します。ヘブライ語やアラビア語をサポートしているシステムで有効です。他の言語では、このスタイルは無視され、エラーとして扱われます。 |
| WS_EX_STATICEDGE | ユーザーの入力を受け付けない項目用の、立体的に見える境界スタイルを持つウィンドウを作成します。 |
| WS_EX_TOOLWINDOW | ツールウィンドウを作成します。これは、フローティングツールバー用のウィンドウです。ツールウィンドウは通常のタイトルバーより小さいタイトルバーを持ちます。タスクバーには表示されません。ユーザーが[Alt]キーと[Tab]キーを同時に押すと現れるダイアログ内にも、表示されません。 |
| WS_EX_TOPMOST | 最前面ウィンドウを作成します。ウィンドウが非アクティブな状態でも、ほかのウィンドウの前面に表示されます。SetWindowPos 関数を使用すると、非最前面ウィンドウに変更できます。 |
| WS_EX_TRANSPARENT | 透過ウィンドウを作成します。このウィンドウの下にあるどのようなウィンドウも、遮られることなく表示されます。このスタイルで作成されたウィンドウは、その下にある兄弟ウィンドウがすべて更新されたときにだけ、WM_PAINT メッセージを受け取ります。 |
| WS_EX_WINDOWEDGE | ウィンドウが盛り上がった縁の境界線を持つことを指定します。 |