標準のウィンドウ コントロール ("EDIT"
コントロールなど) が作成されると、それWNDPROC
はウィンドウ クラスの一部として定義されます (つまり、ウィンドウを表示し、編集コントロールとして動作させるように設計され"EDIT"
た固有のものがあります)。WNDPROC
MFC を使用すると、ウィンドウ コントロールCEdit
の特殊なメッセージのラッパーなどのラッパー クラスを介して、このようなコントロールと対話できます。"EDIT"
MFC ではさらに、"EDIT"
ウィンドウのインスタンスを CEdit の C++ サブクラス、たとえば aにバインドできます。ここでは、およびCMyEdit
の継承された仮想関数をオーバーライドできます。また、メッセージ テーブルを定義して、ウィンドウ インスタンス自体に送信されたメッセージにアクセスしたりオーバーライドしたりできます。 .CEdit
CWnd
現在のメッセージ引数で this->DefWndProc を呼び出すCWnd::Default()があります。WNDPROC
これは、関連付けられている HWNDを検索しているようです。では、これは正しい答えですか? DefWndProc() (または同様に Default()) を呼び出します。どちらがWNDPROC
ウィンドウ コントロールに渡しますか?
明らかに、これは、メッセージを処理しなかったことを示すために FALSE を返すことができる他のメッセージ テーブル ハンドラーとは異なります。MFC は、クラス継承階層を上って、このメッセージの次のメッセージ ハンドラーにメッセージを自動的にルーティングします。 、ネイティブによって処理される Default() にWNDPROC
?
WM_SETTEXT などの任意のメッセージ ハンドラーを定義する場合、このメッセージを に渡す正しい方法は何"EDIT"
WNDPROC
ですか?
また、処理のためにメッセージをスーパークラス (C++ クラス階層) に渡す方法があるかどうかも知りたいです。多くの OnXXX スタイル ハンドラーにはそうする方法がありますが、ON_MESSAGE ハンドラーで機能するメカニズムはありますか?
class CDynamicMenuControlEdit : public CEdit
{
...
LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
...
}
BEGIN_MESSAGE_MAP(CDynamicMenuControlEdit, CEdit)
...
ON_MESSAGE(WM_SETTEXT, OnSetText)
...
END_MESSAGE_MAP()
LRESULT CDynamicMenuControlEdit::OnSetText(
WPARAM wParam, // not used; must be zero
LPARAM lParam // window-text string (LPCTSTR)
)
{
if (m_bHasFocus)
{
// do normal thing
// !!! THIS IS MY QUESTION: IS THIS CALLING EDIT's WNDPROC, or ::DefWinProc()? !!!
return DefWindowProc(WM_SETTEXT, wParam, lParam);
}
...
}
明確化
C++ レベルで複数の MFC サブクラスを持つことができます -
したがって、C は B を継承します。ここで、A は MFC クラスです (例: CEdit
)。
それらのそれぞれは、MFC メッセージ テーブルを持つことができますBEGIN_MESSAGE_MAP
。つまりEND_MESSAGE_MAP
、それぞれ任意の Windows メッセージのハンドラーを持つことができます。たとえばWM_MESSAGE(WM_SETTEXT, OnSetText)
、そのOnSetText
メンバーは必ずしも仮想ではなく、単なる静的メンバーです (各 MFC サブクラスはそのメッセージを次のようにルーティングできます)。任意の方法)。
私の質問は、WM_MESSAGE
ディスパッチ エントリには戻り値がないため、実際の Windows 'EDIT' クラスの wndproc に戻す前に、MFC が MFC ディスパッチ テーブルを C から B、A に移動できるようにするにはどうすればよいですか?
それとも、そのようなすべてのエントリは、MFC 設計レベルで実行されないように意図されていますか? つまり、最もサブクラス化されたレイヤーのディスパッチャーだけが呼び出されるように意図されていますか? 継承されたメンバーを利用したい場合は、手動でその呼び出しを行う必要があります.MFCには、これのための特定の汎用構造がありませんか?