テクニカル ノート 1: ウィンドウ クラスの登録
ここでは、 Microsoft Windows によって必要とされる特別な WNDCLASSes を登録する MFC のルーチンを記述します。MFC で使用する WNDCLASS の特定の属性とウィンドウは説明します。
問題
CWnd の属性は 2 か所でウィンドウの HWND ハンドルと同様に、オブジェクトが格納されます: ペイン オブジェクトと WNDCLASS。WNDCLASS の名前は lpszClassName パラメーターの CWnd::Create と CFrameWnd::Create などの一般的なウィンドウの作成関数に渡されます。
この WNDCLASS は 4 メジャーの 1 に登録する必要があります:
暗黙的に MFC に用意されている WNDCLASSを使用します。
暗黙的に Windows コントロール (または他のコントロール)サブクラス化によって。
明示的に MFC AfxRegisterWndClass か AfxRegisterClassを呼び出して。
明示的に Windows ルーチン RegisterClassを呼び出して。
WNDCLASS フィールド
WNDCLASS の構造はウィンドウ クラスを記述するさまざまなフィールドで構成されます。次の表は、フィールドを示し、 MFC アプリケーションでどのように使用されるかを指定しています:
Field |
Description |
---|---|
lpfnWndProc |
ペインの手順では、 AfxWndProcである必要があります。 |
cbClsExtra |
使用されない場合 (ゼロである必要があります) |
cbWndExtra |
使用されない場合 (ゼロである必要があります) |
hInstance |
AfxGetInstanceHandleと自動的に塗りつぶされて |
hIcon |
フレーム ウィンドウのアイコンは、 " " を参照してください。 |
hCursor |
マウス カーソルがウィンドウにある場合は、次の " " |
hbrBackground |
背景色は、 " " を参照してください。 |
lpszMenuName |
使用されていない (null にする必要があります) |
lpszClassName |
クラス名は、を " |
指定された WNDCLASSes
MFC の旧バージョン (MFC 4.0 の前)に、複数の定義済みのウィンドウ クラス。これらのウィンドウ クラスは、既定で用意されていません。アプリケーションは、適切なパラメーターの AfxRegisterWndClass を使用する必要があります。
アプリケーションが指定したリソース id をリソース (たとえば、 AFX_IDI_STD_FRAME)する場合、 MFC はそのリソースを使用します。それ以外の場合は、既定のリソースを使用します。アイコンには、標準的なアプリケーションのアイコンが使用され、カーソルの場合は、標準の矢印カーソルが使用されます。
シングル ドキュメントの型との 2 種類の MDI アプリケーション アイコン サポート: メイン アプリケーションの 1 個の MDIChild、アイコンのイメージ的なドキュメントまたはウィンドウの他のアイコン。別のアイコンを持つ複数のドキュメントの種類に追加 WNDCLASSes を登録するか、 CFrameWnd::LoadFrame 関数を使用します。
CFrameWnd::LoadFrame は、最初のパラメーター、次の標準属性として指定できるアイコン ID を使用して WNDCLASS を登録します:
クラスの形式: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
アイコン AFX_IDI_STD_FRAME
矢印カーソル
COLOR_WINDOW の背景色
CMDIFrameWnd のクライアント領域が MDICLIENT のペインによって完全に処理されるため、背景色の値と CMDIFrameWnd のカーソルは使用されません。Microsoft は MDICLIENT のペインをサブクラス化が励ましませんしたがって、可能な限り標準色とカーソルの種類を使用します。
サブクラス化とコントロールのスーパークラス化
サブクラスをスーパークラス化するウィンドウ (たとえば、) CButton制御する場合、クラスは自動的に WNDCLASS の属性をそのコントロールのウィンドウの実装で提供されます。
AfxRegisterWndClass 関数
MFC はウィンドウ クラスを登録するためのヘルパー関数を提供します。一連の属性 (ウィンドウ クラスのフォーム、カーソル、背景ブラシやアイコン)の場合、全体的な名前が生成され、結果ペイン クラスが登録されます。次に例を示します。
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
この関数の戻り値生成された登録されたウィンドウ クラス名の一時的な文字列。この関数についての詳細については、 AfxRegisterWndClassを参照してください。
返される文字列は静的な文字列バッファーに一時的なポインターです。これは AfxRegisterWndClassに回復まで有効です。この文字列を保持する場合は、この例のように CString の変数に格納します:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClass はウィンドウ クラスを登録しない場合は CResourceException をスローします (から不適切なパラメーターには、または Windows メモリ)。
RegisterClass と AfxRegisterClass 関数
どの AfxRegisterWndClass が提供するか複雑にした内容は、そのする場合は、 Windows API RegisterClass または MFC 関数 AfxRegisterClassをダイヤルできます。CFrameWnd と CMDIChildWndCWnd、Create 関数が最初のパラメーターとしてウィンドウ クラスの lpszClassName の文字列名を取得します。ユーザー コントロールを登録するのに使用したメソッドに関係なく、登録されたウィンドウ クラス名を使用できます。
Win32 DLL で AfxRegisterClass (または AfxRegisterWndClass)を使用することが重要です。Win32 は自動的に DLL に登録されているクラスの登録を解除されません。 DLL が終了すると明示的にクラスの登録を解除します。RegisterClass の代わりに AfxRegisterClass の使用により、自動的に処理されます。AfxRegisterClass は、 DLL の終了時に DLL に登録される一意のクラスのリストを保持し、自動的にそれらを登録を解除します。DLL で RegisterClass を使用すると、 DLL が終了するとすべてのクラスが登録を解除する必要があります。 DllMain (関数)。別のクライアント アプリケーションを DLL の使用を試みると、失敗すると、 RegisterClass が予期せず失敗することがあります。