注
次のテクニカル ノートは、最初にオンライン ドキュメントに含まれてから更新されていません。 その結果、一部の手順やトピックが古くなっているか、正しくない可能性があります。 最新情報については、オンライン ドキュメント インデックスで関心のあるトピックを検索することをお勧めします。
このメモでは、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 | 未使用 |
収益 | AfxWndProc によって処理された場合は 1 |
WM_SIZEPARENT
このメッセージは、コントロール バーをフレームの横に再配置するために、サイズ変更中 (CWnd::RepositionBars
を呼び出すCFrameWnd::RecalcLayout
CFrameWnd::OnSize
呼び出し) 中に、フレーム ウィンドウによって直下の子に送信されます。 AFX_SIZEPARENTPARAMS構造体には、親の現在使用可能なクライアントの四角形と、再描画を最小限に抑えるために DeferWindowPos
を呼び出す HDWP (NULL) が含まれています。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 未使用 |
lParam | AFX_SIZEPARENTPARAMS構造体のアドレス |
収益 | 使用しない (0) |
メッセージを無視すると、ウィンドウがレイアウトに参加しないことを示します。
WM_SETMESSAGESTRING
このメッセージはフレーム ウィンドウに送信され、ステータス バーのメッセージ行を更新するように求められます。 文字列 ID または LPCSTR のいずれかを指定できます (両方を指定することはできません)。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 文字列 ID (または 0) |
lParam | 文字列 (または NULL) の LPCSTR |
収益 | 使用しない (0) |
WM_IDLEUPDATECMDUI
このメッセージは、update-command UI ハンドラーのアイドル時間更新を実装するためにアイドル時間で送信されます。 ウィンドウ (通常はコントロール バー) がメッセージを処理する場合は、 CCmdUI
オブジェクト (または派生クラスのオブジェクト) を作成し、ウィンドウ内の各 "items" に対して CCmdUI::DoUpdate
を呼び出します。 これにより、コマンド ハンドラー チェーン内のオブジェクトのON_UPDATE_COMMAND_UI ハンドラーがチェックされます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | BOOL bDisableIfNoHandler |
lParam | 使用しない (0) |
収益 | 使用しない (0) |
ON_UPDATE_COMMAND_UIもON_COMMANDハンドラーもない場合、ui オブジェクトを無効にするには、bDisableIfNoHandler は 0 以外です。
WM_EXITHELPMODE
このメッセージは、コンテキスト依存ヘルプ モードを終了する CFrameWnd
に投稿されます。 このメッセージを受信すると、 CFrameWnd::OnContextHelp
によって開始されたモーダル ループが終了します。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 使用しない (0) |
lParam | 使用しない (0) |
収益 | 未使用 |
WM_INITIALUPDATE
このメッセージは、フレーム ウィンドウの最初の更新を安全に実行できる場合に、ドキュメント テンプレートによってフレーム ウィンドウのすべての子孫に送信されます。
CView::OnInitialUpdate
の呼び出しにマップされますが、他のCWnd
派生クラスで他のワンショット更新に使用できます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 使用しない (0) |
lParam | 使用しない (0) |
収益 | 使用しない (0) |
WM_RECALCPARENT
このメッセージは、ビューによって親ウィンドウ ( GetParent
経由で取得) に送信され、レイアウトの再計算が強制されます (通常、親は RecalcLayout
を呼び出します)。 これは、ビューの合計サイズが大きくなるとフレームのサイズを拡大する必要がある OLE サーバー アプリケーションで使用されます。
親ウィンドウがこのメッセージを処理する場合は、TRUE を返し、lParam で渡された RECT にクライアント領域の新しいサイズを入力する必要があります。 これは、サーバー オブジェクトがインプレース アクティブ化されたときにスクロール バーを適切に処理するために CScrollView
で使用されます (追加時にウィンドウの外側に配置します)。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 使用しない (0) |
lParam | LPRECT rectClient、NULL を指定できます |
収益 | 新しいクライアントの四角形が返された場合は TRUE、それ以外の場合は FALSE |
WM_SIZECHILD
このメッセージは、ユーザーがサイズ変更ハンドルを使用してサイズ変更バーのサイズを変更すると、 COleResizeBar
が所有者ウィンドウ ( GetOwner
経由) に送信されます。
COleIPFrameWnd
は、ユーザーが要求したフレーム ウィンドウの位置を変更しようとすることで、このメッセージに応答します。
サイズ変更バーを含むフレーム ウィンドウに対するクライアント座標で指定された新しい四角形は、lParam によって指されます。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 使用しない (0) |
lParam | LPRECT rectNew |
収益 | 使用しない (0) |
WM_DISABLEMODAL
このメッセージは、非アクティブ化されているフレーム ウィンドウが所有するすべてのポップアップ ウィンドウに送信されます。 フレーム ウィンドウでは、結果を使用して、ポップアップ ウィンドウを無効にするかどうかを決定します。
これを使用すると、フレームがモーダル状態になったときにポップアップ ウィンドウで特別な処理を実行したり、特定のポップアップ ウィンドウが無効にならないようにしたりできます。 たとえば、フレーム ウィンドウがモーダル状態になったときに、ツールヒントはこのメッセージを使用して自分自身を破棄します。
パラメーターと戻り値 | 説明 |
---|---|
wParam | 使用しない (0) |
lParam | 使用しない (0) |
収益 | ウィンドウを無効に しない 場合は 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 では、RT_TOOLBARとRT_DLGINITという 2 つのプライベート リソース形式が定義されています。
RT_TOOLBAR リソース形式
AppWizard によって提供される既定のツール バーは、MFC 4.0 で導入されたRT_TOOLBARカスタム リソースに基づいています。 このリソースは、ツール バー エディターを使用して編集できます。
RT_DLGINIT リソース形式
1 つの MFC プライベート リソース形式を使用して、追加のダイアログ初期化情報を格納します。 これには、コンボ ボックスに格納されている初期文字列が含まれます。 このリソースの形式は手動で編集するようには設計されていませんが、Visual C++ によって処理されます。
Visual C++ とこのRT_DLGINIT リソースは、リソース内の情報を使用する代わりに API があるため、MFC の関連機能を使用する必要はありません。 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します (データはテキスト文字列です)。