テクニカル ノート 24: MFC で定義されているメッセージおよびリソース
更新 : 2007 年 11 月
メモ : |
---|
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。 |
このノートでは、MFC が使用する Windows メッセージやリソースの内部形式について説明します。このノートではフレームワークの実装について説明するので、アプリケーションのデバッグを行うときに役立ちます。ここで解説される情報はすべて公式にサポートされているものではありませんが、高度なプログラミングを行うために利用できる情報です。
このノートでは MFC の実装内部の非公式な詳細部分を解説します。このノートの内容は将来変更される可能性があります。MFC が内部的に使用する Windows メッセージ (MFC プライベート Windows メッセージ) は、1 つのアプリケーション内部でのみ意味を持ちます。ただし将来的には、これらのメッセージはシステム全体で有効なメッセージに変更される予定です。
MFC プライベート Windows メッセージとリソース種類の値が取り得る範囲は、Windows によって確保されたシステム予約範囲です。現時点ではこの範囲のすべての値が使用されているわけではありませんが、未使用部分も将来的に使用される可能性があります。また現在使用されている値が変更されることもあり得ます。
MFC プライベート Windows メッセージが取り得る値の範囲は 0x360->0x37F です。
MFC プライベート リソースの種類が取り得る値の範囲は 0xF0->0xFF です。
MFC プライベート Windows メッセージ
MFC プライベート Windows メッセージは C++ の仮想関数の代わりに使用されます。Windows オブジェクトどうしを結び付けるときは C++ 仮想関数よりも柔軟な結合が要求されるため、プライベート Windows メッセージが使用されます。
MFC プライベート Windows メッセージとそれに関連するパラメータ構造は MFC プライベート ヘッダー ファイル 'AFXPRIV.H' で定義されています。このヘッダー ファイルをインクルードしたコードは、ドキュメントに記述されていない処理を行う可能性があり、また将来の MFC との互換性が保証されないことに注意してください。
これらのメッセージに対してハンドラを作成する必要はほとんどありません。ハンドラを作成する必要がある場合は、メッセージ マップ マクロ ON_MESSAGE と汎用パラメータ形式 LRESULT/WPARAM/LPARAM を使ってメッセージを処理できます。
WM_QUERYAFXWNDPROC
このメッセージは、作成するウィンドウに送られます。このメッセージはウィンドウの作成プロセスの早い段階で送られ、WndProc が AfxWndProc かどうかを判断するために使われます。AfxWndProc は 1 を返します。
wParam |
未使用 |
lParam |
未使用 |
返される結果は以下のようになります。 |
AfxWndProc の場合は 1 |
WM_SIZEPARENT
このメッセージは、サイズ変更時にコントロール バーをフレームの隣接位置に表示するために、フレーム ウィンドウからその直接の子ウィンドウに送られます。つまり、CFrameWnd::OnSize が CFrameWnd::RecalcLayout を呼び出し、次に RecalcLayout が CWnd::RepositionBars を呼び出します。AFX_SIZEPARENTPARAMS 構造体には、現在の親のクライアント領域を表す四角形と HDWP (NULL 値を取る場合もあります) が含まれています。HDWP を DeferWindowPos に渡すと再描画しなければならない最小の領域が得られます。
wParam |
未使用 |
lParam |
AFX_SIZEPARENTPARAMS 構造体のアドレス |
返される結果は以下のようになります。 |
未使用 (0) |
このメッセージを無視すると、そのウィンドウはコントロール バーのレイアウトには無関係であると見なされます。
WM_SETMESSAGESTRING
このメッセージはフレーム ウィンドウに送られ、ステータス バーのメッセージ行の更新を要求します。ID か LPCSTR を指定できます。両方同時には指定できません。
wParam |
文字列の ID (指定しないときは 0) |
lParam |
文字列 LPCSTR (指定しないときは NULL) |
返される結果は以下のようになります。 |
未使用 (0) |
WM_IDLEUPDATECMDUI
このメッセージは、ユーザー インターフェイス更新ハンドラの更新処理を行うためにアイドル時に送出されます。ウィンドウ (通常はコントロール バー) は、このメッセージを受け取ると、CCmdUI オブジェクトを生成して、ウィンドウ中の各アイテムに対して CCmdUI::DoUpdate を呼び出します。これにより、各アイテムに対応するオブジェクトの ON_UPDATE_COMMAND_UI ハンドラがコマンド ハンドラ チェイン中に存在するかどうかがチェックされます。
wParam |
BOOL bDisableIfNoHandler |
lParam |
未使用 (0) |
返される結果は以下のようになります。 |
未使用 (0) |
bDisableIfNoHandler が 0 以外の値であるときは、ON_UPDATE_COMMAND_UI ハンドラと ON_COMMAND ハンドラが両方とも存在しないユーザー インターフェイス オブジェクトは選択不可能になります。
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 値を取る場合もあります) |
返される結果は以下のようになります。 |
新しいクライアント領域 RECT が返ったときは 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 が設定されていて、親フレームがアクティブになると同時にウィンドウがアクティブになる場合は、ゼロ以外の値が返されます。スタイルが MFS_SYNCACTIVE に設定されていると、CMiniFrameWnd からゼロ以外の値が返されます。
この詳細については、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 リソース形式
この 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。データはテキスト文字列です)。