5

関数 OnSize(..) の MFC の次の 2 つのメッセージ トラップの違いは (あるとすれば) どうなのかと思っていました。

1 - メッセージ マップ経由:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
    ON_WM_SIZE()
..
END_MESSAGE_MAP()

2 - afx_message 経由:

afx_msg type OnSize(...);

それらは同じ意味で使用されているようですが、どちらを使用する必要がありますか、それとも他の要因に依存しますか?

4

3 に答える 3

12

クラスにメッセージ ハンドラーを追加するには、両方の部分が必要です。メッセージ マップは、任意のメッセージ ハンドラー関数 (例: ) の宣言と共に、クラス内で宣言する必要がありますOnSize

class CClassWnd : public CBaseClassWnd {
    ...
    afx_msg void OnSize(UINT nType, int cx, int cy);
    DECLARE_MESSAGE_MAP
};

afx_msgは単なる空のプレースホルダー マクロです。実際には何もしませんが、慣例により常に含まれています。

メッセージ マップは、クラスの .cpp ファイルで定義されます。

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
    ON_WM_SIZE()
END_MESSAGE_MAP()

これらのマクロは、ウィンドウが受信したメッセージを対応するハンドラ関数にディスパッチできるクラスのルックアップ テーブルを生成します。このON_WM_SIZEマクロを使用すると、メッセージ内のwParamおよびlParamメッセージ パラメータをWM_SIZE、メッセージ ハンドラ関数 (この場合はnTypecx、および) にとってより意味のある値にデコードできます。cyMFC は、ほとんどのウィンドウ メッセージ ( 、 など) 用のマクロを提供しWM_LBUTTONDOWNますWM_DESTROY

MFC でメッセージ マップがどのように機能するかの詳細については、MSDN を参照してください。

于 2008-10-14T10:22:48.630 に答える
3

afx_msg は単なる空のマクロです。基本的には、読みやすくするために、メソッドが MFC メッセージ ハンドラーであることを示すためのものです。そこにafx_msgがあっても、メッセージマップにエントリが必要です。

于 2008-10-14T09:54:17.313 に答える
0

一部の Windows メッセージはMFCによって既に処理されているため、このような場合は、派生クラスにメソッドを追加するだけで済みます。

たとえば、CWndクラス (他の多くの MFC クラスと同様) は、いくつかの Windows メッセージをそのメッセージ マップ (つまり、 ON_WM_DRAWITEMON_WM_MEASUREITEMON_WM_ENTERIDLEなど) に既にマップしています。

ただし、MFC によってまだマップされていないその他のメッセージが機能するには、メッセージ マップにクラス メソッドとエントリの両方が必要です。

于 2008-10-15T03:51:00.853 に答える