このノートでは、Microsoft Windows が必要な特別のWNDCLASSes を登録する MFC ルーチンについて説明します。MFC での特定のWNDCLASS属性を使用し、Windows を説明しています。
問題
Windows では、 HWNDのように、 CWndオブジェクトの属性が 2 つの場所に格納されます: ウィンドウ オブジェクトとWNDCLASS。WNDCLASSは、C++ クラスよりも異なっています。WNDCLASS名lpszClassNameパラメーターで:createやCFrameWnd::Createなど一般的なウィンドウ作成関数に渡される。
このWNDCLASSは、4 つの手段の 1 つを介して登録する必要があります。:
WNDCLASSes と MFC
WNDCLASS構造体では、ウィンドウ クラスを記述するさまざまなフィールドで構成されます。以下のフィールドと、MFC アプリケーションでの使用方法です。
| スタイル | ウィンドウのスタイル: 下記参照 |
| LpfnWndProc | ウィンドウ プロシージャ、する必要がありますAfxWndProc |
| CbClsExtra | 使用しない (0 にする必要があります) |
| CbWndExtra | 使用しない (0 にする必要があります) |
| HInstance | 自動的にAfxGetInstanceHandleで |
| HIcon | フレーム ウィンドウのアイコンを参照してください下 |
| HCursor | ウィンドウ上のマウスの場合はカーソルを参照してください下 |
| HbrBackground | 背景色、以下を参照してください。 |
| LpszMenuName | 使用 (NULL にする必要があります) |
| LpszClassName | クラス名は、以下を参照してください。 |
Wndclass
以前のバージョンの MFC (MFC 4.0) する前に、用意されている定義済みのウィンドウ クラスの数だった。これらのウィンドウ クラスが既定で MFC アプリケーションと OLE コントロールの両方に、MFC Dll を使用する可能性がありますが、実際に関連の問題と同様に (複数のバージョンの MFC は 1 つのアドレス空間にロード) のバージョン管理に関連する技術的な問題のための提供されなくなりました。
これら以前WNDCLASSes を提供を使用してコードを移行するときに、次の参照が提供されます。アプリケーションがこれらのクラスの代わりにAfxRegisterWndClass (、適切なパラメーター) を使用します。
クラスとその属性を次に示します:
アプリケーション ID (たとえば、AFX_IDI_STD_FRAME) の指定したリソース ID とリソースを提供する場合、MFC はそのリソースを使用します。それ以外の場合、既定のリソースが使用されます。アイコン、標準アプリケーション アイコンを使用し、カーソルを標準の矢印カーソルが使用されます。
MDI アプリケーションの 1 つのドキュメント タイプ (1 つのアイコンは、メインのアプリケーション、象徴的なドキュメント ・ MDIChild ウィンドウの他のアイコン) をサポートする 2 つのアイコンです。別のアイコンを複数のドキュメント タイプの追加のWNDCLASSes を登録またはcframewnd::loadframe関数を使用する必要があります。
Cframewnd::loadframe標準の「AfxFrameOrView」属性を使用して LoadFrame 最初のパラメーターとして指定したアイコン ID を使用して、 WNDCLASSを自動的に登録されます。
MDIFrameWndのクライアント領域が「MDICLIENT」ウィンドウによって完全に覆われているので、背景色の値とMDIFrameWndカーソルは使用されません。Microsoft が奨励していない「MDICLIENT」ウィンドウをサブクラス化ので、使用可能な場合カーソルの種類標準の色。
コントロールのサブクラスの作成
場合は、サブクラス化またはスーパークラス、Windows (たとえば、 CButton)、クラスを自動的に制御、Windows のコントロールの実装、 WNDCLASS属性を取得します。
AfxRegisterWndClass 関数
MFC は、ウィンドウ クラスを登録するため、ヘルパー ルーチンを提供します。一連の属性 (ウィンドウ クラスのスタイル、カーソル、背景ブラシ、アイコン) を与え、合成名が生成されます、および結果のウィンドウ クラスが登録されています。たとえば,
const char ※ AfxRegisterWndClass (UINT nClassStyle、HCURSOR hCursor、HBRUSH hbrBackground、HICON hIcon)
この関数は、生成された登録済みのウィンドウ クラス名の一時的な文字列を返します。詳細については、クラス ライブラリ リファレンスを参照してください。
返される文字列はAfxRegisterWndClassに対する次の呼び出しまで有効な静的文字列バッファーへの一時的なポインターです。この文字列を維持するには、 CString変数に格納します。たとえば,
CString strWndClass AfxRegisterWndClass (CS_DBLCLK、...); =...CWnd ※ pWnd 新しい CWnd; =pWnd gt;(StrWndClass、...) を作成します。(&G)
場合は、ウィンドウ クラス (悪いパラメーターのためのまたは Windows メモリの不足) を登録できませんでしたAfxRegisterWndClass CResourceExceptionがスローされます。
AfxRegisterClass 関数、RegisterClass
AfxRegisterWndClass何を提供するよりもより高度な何かをする場合は、Windows API RegisterClassまたは MFC 関数AfxRegisterClassを呼び出すことができます。CWnd、 CFrameWnd 、 CMDIChildWnd作成機能ウィンドウ クラスの名前をlpszClassName文字列を最初のパラメーターとして取る。登録方法に関係なく、ウィンドウ クラス名を使用することができます。 。
AfxRegisterClass ( AfxRegisterWndClass) Win32 の DLL で使用することが重要です。自動的に Win32 DLL が終了したときこの明示的に行う必要がありますので、DLL によって登録されたクラスを登録解除されません。RegisterClassの代わりにAfxRegisterClassを使用して自動的にあなたのためこれです。AfxRegisterClassで DLL を登録の一意のクラスの一覧を保持し、DLL の終了時に自動的に [登録解除されます。RegisterClassで DLL を使用すると、( DllMain関数)、DLL の終了時にすべてのクラスが登録されていないことを保証する必要があります。これを行うにRegisterClassが突然別のクライアント アプリケーションが DLL を使用するときを失敗する可能性があります。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)