テクニカル ノート 24: MFC で定義されているメッセージおよびリソース
Note
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。 結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。 最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
このメモでは、MFC で使用される内部 Windows メッセージとリソース形式について説明します。 この情報は、フレームワークの実装について説明し、アプリケーションのデバッグに役立ちます。 このような情報はすべて公式にサポートされていませんが、これらの情報の一部を高度な実装に使用することもできます。
このメモには、MFC のプライベート実装の詳細が含まれています。すべての内容は将来変更される可能性があります。 MFC プライベート Windows メッセージは、1 つのアプリケーションのスコープ内でのみ意味を持ちますが、将来はシステム全体のメッセージを含むように変更されます。
MFC プライベート Windows メッセージの範囲とリソースの種類は、Microsoft Windows によって確保されている予約済みの "システム" 範囲内にあります。 現在、範囲内のすべての数値が使用されているわけではありません。将来、範囲内の新しい数値が使用される可能性があります。 現在使用されている数値は変更される可能性があります。
MFC プライベート Windows メッセージは、0x360->0x37F の範囲内です。
MFC プライベート リソースの種類は、0xF0->0xFF の範囲内です。
MFC プライベート Windows メッセージ
これらの Windows メッセージは、C++ 仮想関数の代わりに使用されます。この場合、ウィンドウ オブジェクトと、C++ 仮想関数は適切ではない結合が必要になります。
これらのプライベート Windows メッセージおよび関連するパラメーター構造は、MFC のプライベートヘッダー 'AFXPRIV.H' で宣言されています。 このヘッダーを含むコードは、ドキュメント化されていない動作に依存している可能性があり、MFC の将来のバージョンでは機能しない可能性があることに注意してください。
これらのメッセージのいずれかを処理する必要がある場合はまれに、ON_MESSAGE メッセージ マップ マクロを使用して、汎用的な LRESULT/WPARAM/LPARAM 形式でメッセージを処理する必要があります。
WM_QUERYAFXWNDPROC
このメッセージは、作成中のウィンドウに送信されます。 これは、WndProc が AfxWndProc かどうかを判断する方法として、作成プロセスの早い段階で送信されます。AfxWndProc は 1 を返します。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 非使用 |
lParam | 非使用 |
returns | AfxWndProc によって処理された場合は1 |
WM_SIZEPARENT
このメッセージは、サイズ変更 (CWnd::RepositionBars
を呼び出す CFrameWnd::RecalcLayout
を呼び出す CFrameWnd::OnSize
) 中に、フレーム ウィンドウによって直接の子に送信され、フレームの周囲のコントロール バーの位置を変更します。 AFX_SIZEPARENTPARAMS 構造体には、親の現在使用可能なクライアントの四角形と、再描画を最小化するために DeferWindowPos
を呼び出すHDWP (NULL の場合もあります) が含まれます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 非使用 |
lParam | AFX_SIZEPARENTPARAMS 構造体のアドレス |
returns | 不使用 (0) |
メッセージを無視すると、ウィンドウがレイアウトに含まれないことを示します。
WM_SETMESSAGESTRING
このメッセージはフレーム ウィンドウに送信され、ステータス バーのメッセージ行を更新するように要求されます。 文字列 ID または LPCSTR のいずれかを指定できます (両方を指定することはできません)。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 文字列 ID (またはゼロ) |
lParam | 文字列の LPCSTR (または NULL) |
returns | 不使用 (0) |
WM_IDLEUPDATECMDUI
このメッセージは、アイドル時間に送信され、更新コマンドの UI ハンドラーのアイドルタイムの更新を実装します。 ウィンドウ (通常はコントロールバー) がメッセージを処理する場合は、CCmdUI
オブジェクト (または派生クラスのオブジェクト) を作成し、ウィンドウ内の各 "項目" に対して CCmdUI::DoUpdate
を呼び出します。 これにより、コマンドハンドラー チェーン内のオブジェクトの ON_UPDATE_COMMAND_UI ハンドラーが確認されます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | BOOL bDisableIfNoHandler |
lParam | 不使用 (0) |
returns | 不使用 (0) |
ON_UPDATE_COMMAND_UI も ON_COMMAND ハンドラーも存在しない場合、bDisableIfNoHandler は 0 以外であると UI オブジェクトを無効にします。
WM_EXITHELPMODE
このメッセージは、状況依存のヘルプモードを終了するために CFrameWnd
にポストされます。 このメッセージの受信は、CFrameWnd::OnContextHelp
によって開始されたモーダルループを終了します。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 不使用 (0) |
lParam | 不使用 (0) |
returns | 非使用 |
WM_INITIALUPDATE
このメッセージは、最初の更新を実行するのが安全な場合に、ドキュメント テンプレートによってフレーム ウィンドウのすべての子孫に送信されます。 CView::OnInitialUpdate
の呼び出しにマップされますが、他の 1 回の更新では他の CWnd
派生クラスで使用できます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 不使用 (0) |
lParam | 不使用 (0) |
returns | 不使用 (0) |
WM_RECALCPARENT
このメッセージは、(GetParent
を通じて取得された) 親ウィンドウにビューによって送信され、レイアウトの再計算を強制的に実行します (通常は親が RecalcLayout
を呼び出します)。 これは、ビューの合計サイズが大きくなるにつれてフレームのサイズを大きくする必要がある OLE サーバー アプリケーションで使用されます。
親ウィンドウがこのメッセージを処理する場合は、TRUE を返し、クライアント領域の新しいサイズを使用して、lParam で渡された四角形に入力する必要があります。 これは、サーバーオブジェクトが埋め込み先でアクティブになっているときに、スクロールバーを正しく処理するために CScrollView
で使用されます (その後、追加時にウィンドウの外側に配置されます)。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 不使用 (0) |
lParam | LPRECT rectClient は NULL になる場合があります |
returns | 新しいクライアント四角形が返された場合は TRUE、それ以外の場合は FALSE |
WM_SIZECHILD
このメッセージは、ユーザーがサイズ変更ハンドルを使用してサイズ変更バーのサイズを変更すると、COleResizeBar
によって所有者ウィンドウ (GetOwner
経由) に送信されます。 COleIPFrameWnd
は、ユーザーが要求したフレーム ウィンドウの位置を変更しようとして、このメッセージに応答します。
サイズ変更バーを含むフレーム ウィンドウを基準にしたクライアント座標で指定された新しい四角形は、lParam によって指されます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 不使用 (0) |
lParam | LPRECT rectNew |
returns | 不使用 (0) |
WM_DISABLEMODAL
このメッセージは、非アクティブ化されているフレーム ウィンドウが所有しているすべてのポップアップ ウィンドウに送信されます。 フレーム ウィンドウは、結果を使用して、ポップアップ ウィンドウを無効にするかどうかを決定します。
これを使用すると、フレームがモーダル状態に入った場合にポップアップ ウィンドウで特別な処理を実行したり、特定のポップアップ ウィンドウが無効にならないようにできます。 ヒントでは、このメッセージを使用して、フレーム ウィンドウがモーダル状態に入った場合など、自身を破棄します。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 不使用 (0) |
lParam | 不使用 (0) |
returns | ウィンドウを無効にしない場合は 0 以外です。0 はウィンドウが無効になることを示します |
WM_FLOATSTATUS
このメッセージは、フレームが別のトップ レベル のフレーム ウィンドウによってアクティブ化または非アクティブ化されると、フレーム ウィンドウが所有しているすべてのポップアップ ウィンドウに送信されます。 これは、CMiniFrameWnd
の MFS_SYNCACTIVE の実装によって使用されます。これは、これらのポップアップ ウィンドウのアクティブ化と、トップ レベルのフレーム ウィンドウのアクティブ化との同期を維持するために使用されます。
パラメーター | 説明 |
---|---|
wParam | 次のいずれかの値です: FS_SHOW FS_HIDE FS_ACTIVATE FS_DEACTIVATE FS_ENABLEFS_DISABLE FS_SYNCACTIVE |
lParam | 不使用 (0) |
FS_SYNCACTIVE が設定され、ウィンドウでアクティブ化と親フレームが同期される場合、戻り値は 0 以外である必要があります。 CMiniFrameWnd
は、スタイル がMFS_SYNCACTIVE に設定されている場合に 0 以外の値を返します。
実装の詳細については、「CMiniFrameWnd
」を参照してください。
WM_ACTIVATETOPLEVEL
このメッセージは、"トップ レベル グループ" 内のウィンドウがアクティブ化または非アクティブ化されると、トップ レベル のウィンドウに送信されます。 ウィンドウがトップ レベル のウィンドウ (親または所有者なし) の場合、またはそのようなウィンドウによって所有されている場合、ウィンドウはトップ レベル グループの一部です。 このメッセージは WM_ACTIVATEAPP と同様に使用されますが、異なるプロセスに属するウィンドウが 1 つのウィンドウ階層 (OLE アプリケーションで一般的) に混在している場合に機能します。
WM_COMMANDHELP、WM_HELPHITTEST、WM_EXITHELPMODE
これらのメッセージは、状況依存ヘルプの実装で使用されます。 詳細については 、テクニカル ノート 28 を参照してください。
MFC プライベート リソースの形式
現在、MFC では、2 つのプライベート リソース形式 (RT_TOOLBAR と RT_DLGINIT) を定義しています。
RT_TOOLBAR リソース形式
AppWizard によって提供される既定のツール バーは、MFC 4.0 で紹介された RT_TOOLBAR カスタム リソースに基づいています。 このリソースは、ツールバー エディターを使用して編集できます。
RT_DLGINIT リソース形式
1 つの MFC プライベート リソース形式は、追加のダイアログ初期化情報を格納するために使用されます。 これには、コンボ ボックスに格納されている最初の文字列が含まれます。 このリソースの形式は、手動で編集するようには設計されていないが、Visual C++ で処理されます。
Visual C++ とこの RT_DLGINIT リソースは、MFC の関連機能を使用する必要はありません。リソース内の情報を使用する代わりに API が使用される可能性があります。 この Visual C++ を使用すると、長期的にアプリケーションの記述、保守、および変換がはるかに簡単になります。
RT_DLGINIT リソースの基本的な構造は次のとおりです:
+---------------+ \
| Control ID | UINT |
+---------------+ |
| Message # | UINT |
+---------------+ |
|length of data | DWORD |
+---------------+ | Repeated
| Data | Variable Length | for each control
| ... | and Format | and message
+---------------+ /
| 0 | BYTE
+---------------+
繰り返しセクションには、メッセージを送信する制御 ID、送信するメッセージ # (通常の Windows メッセージ)、およびデータの可変長が含まれます。 Windows メッセージは、次の形式で送信されます:
SendDlgItemMessage(<Control ID>, <Message #>, 0, &<Data>);
これは非常に一般的な形式であり、すべての Windows メッセージとデータ コンテンツを許可します。 Visual C++ リソース エディタと MFC では、Windows メッセージの限られたサブセットのみがサポートされます。コンボ ボックスの最初のリスト選択の場合は CB_ADDSTRING (データはテキスト文字列) です。