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構造体】
UNITcbSizesizeof (WNDCLASSEX)
UNITstyleウィンドウ・クラスのスタイル
WNDPROClptnWndProcウィンドウ・プロシジャー。省略不可
intcbClsExtraウィンドウ・クラスへ追加メモリの割り当て。0 設定可能
intcbWndExtraウィンドウへ追加メモリの割り当て。0 設定可能
HINSTANCEhInstanceウィンドウ・プロシジャーのモジュール・インスタンス
HICONhIconアイコンのハンドル。NULL設定可能
HCURSORhCursorカーソルのハンドル。NULL設定可能
HBRUSHhbrBackground背景色。NULL設定可能
LPCTSTRlpszMenuNameメニュー・リソース名。NULL設定可能
LPCTSTRlpszClassNameクラス名。省略不可
HICONhIconSm小さいアイコンのハンドル。NULL設定可能
【ウィンドウ・クラスのスタイル(style)】
Style内容
CS_BYTEALIGNCLIENTウィンドウのクライアントエリアの幅と水平位置の調整
CS_BYTEALIGNWINDOWウィンドウの幅と水平位置の調整
CS_CLASSDCクラス中のすべてのウィンドウに共通のデバイスを割り当てる
CS_DBLCLKSダブルクリックメッセージをウィンドウに送る。
CS_GLOBALCLASSグローバル・ウィンドウ・クラス(レジストリ使用)
CS_HREDRAWクライアントエリアの幅を変更した時、全体のウィンドウを再描画
CS_NOCLOSEウィンドウメニューの上の終了を使用不可
CS_OWNDCユニークなデバイスをの各ウィンドウに割り当てます
CS_PARENTDC親ウィンドウに子ウィンドウのクリッピング地域を設定
CS_SAVEBITSスクリーンイメージのビットマップを保持し、Windowが取り去られた場所へ保持したビットマップを再表示
CS_VREDRAWクライアントエリアの高さを変更した時、全体のウィンドウを再描画
【背景色のブラシ・ハンドル(hbrBackground)】
ハンドルブラシ
COLOR_3DDKSHADOW3D オブジェクトの暗い影の色
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ウィンドウ内のテキストの色

  2.CreateWindow() または、CreateWindowEx()で作成 拡張スタイルを指定したい場合は、CreateWindowEx()を使用します。     [API]      HWND CreateWindow (            LPCTSTR lpClassName, //ウィンドウ・クラス名            LPCTSTR lpWindowName, //タイトル名            DWORD dwStyle, //ウィンドウ・スタイル            int x, //ウィンドウの水平位置            int y, //ウィンドウの縦位置            int nWidth, //ウィンドウの幅            int nHeight, //ウィンドウの高さ            int hWndParent, //親、または、オーナー・ウィンドウのハンドル            int hMenu, //メニュー、または、子ウィンドウのID            int hInstance, //インスタンス・ハンドル            int lpParam, //WM_CREATEのパラメータへのポインタ            );      HWND CreateWindowEx (            DWORD dwExStyle, //ウィンドウの拡張スタイル            LPCTSTR lpClassName, //ウィンドウ・クラス名            LPCTSTR lpWindowName, //タイトル名            DWORD dwStyle, //ウィンドウ・スタイル。            int x, //ウィンドウの水平位置            int y, //ウィンドウの縦位置            int nWidth, //ウィンドウの幅            int nHeight, //ウィンドウの高さ            int hWndParent, //親、または、オーナー・ウィンドウのハンドル            int hMenu, //メニュー、または、子ウィンドウのID            int hInstance, //インスタンス・ハンドル            int lpParam, //WM_CREATEのパラメータへのポインタ            ); 【ウィンドウのスタイル(dwStyle)】 このパラメータは、ウィンドウスタイルとコントロールスタイルの組み合わせになります。詳細はMSDNを参照してください。 【ウィンドウの拡張スタイル(dwExStyle)】
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_MDICHILDMDI 子ウィンドウを作成します。
WS_EX_NOPARENTNOTIFYこのスタイルで作成された子ウィンドウが作成されたり破棄されたりするときに、その親ウィンドウにWM_PARENTNOTIFY メッセージを送らないように指定します。
WS_EX_OVERLAPPEDWINDOWWS_EX_CLIENTEDGE スタイルと WS_EX_WINDOWEDGE スタイルの組み合わせです。
WS_EX_PALETTEWINDOWWS_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ウィンドウが盛り上がった縁の境界線を持つことを指定します。

  3.DestroyWindow() または、DefWindowProc()へのWM_CLOSEメッセージ送信でウィンドウを破棄 BOOL DestroyWindow( HWND hWnd //破棄するウィンドウのハンドル );