次の方法で共有


テクニカル ノート 1: ウィンドウ クラスの登録

ここでは、 Microsoft Windows によって必要とされる特別な WNDCLASSes を登録する MFC のルーチンを記述します。MFC で使用する WNDCLASS の特定の属性とウィンドウは説明します。

問題

CWnd の属性は 2 か所でウィンドウの HWND ハンドルと同様に、オブジェクトが格納されます: ペイン オブジェクトと WNDCLASSWNDCLASS の名前は lpszClassName パラメーターの CWnd::CreateCFrameWnd::Create などの一般的なウィンドウの作成関数に渡されます。

この WNDCLASS は 4 メジャーの 1 に登録する必要があります:

  • 暗黙的に MFC に用意されている WNDCLASSを使用します。

  • 暗黙的に Windows コントロール (または他のコントロール)サブクラス化によって。

  • 明示的に MFC AfxRegisterWndClassAfxRegisterClassを呼び出して。

  • 明示的に 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をダイヤルできます。CFrameWndCMDIChildWndCWndCreate 関数が最初のパラメーターとしてウィンドウ クラスの lpszClassName の文字列名を取得します。ユーザー コントロールを登録するのに使用したメソッドに関係なく、登録されたウィンドウ クラス名を使用できます。

Win32 DLL で AfxRegisterClass (または AfxRegisterWndClass)を使用することが重要です。Win32 は自動的に DLL に登録されているクラスの登録を解除されません。 DLL が終了すると明示的にクラスの登録を解除します。RegisterClass の代わりに AfxRegisterClass の使用により、自動的に処理されます。AfxRegisterClass は、 DLL の終了時に DLL に登録される一意のクラスのリストを保持し、自動的にそれらを登録を解除します。DLL で RegisterClass を使用すると、 DLL が終了するとすべてのクラスが登録を解除する必要があります。 DllMain (関数)。別のクライアント アプリケーションを DLL の使用を試みると、失敗すると、 RegisterClass が予期せず失敗することがあります。

参照

その他の技術情報

番号順テクニカル ノート

カテゴリ別テクニカル ノート