編譯錯誤 C2440: cannot convert from 'long (__cdecl *)(UINT, LONG)' to 'long (CWnd::*)(UINT, LONG)' 表明消息處理函數簽名與宏期望的成員函數指針類型不匹配。
ON_REGISTERED_MESSAGE 宏要求處理函數為 CWnd 的非靜態成員函數,簽名必須為:
afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);
你的代碼中 OnFind 可能被聲明為 static、全局函數、或所在類非 CWnd 衍生類,導致 thiscall 約定不匹配。
CWnd(如 CFrameWnd、CDialog、CView)。afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);ON_REGISTERED_MESSAGE(wm_Find, OnFind)LRESULT,而非 long(雖在 32 位下相同,但語義更正確)。class CMainFrame : public CFrameWnd {
DECLARE_MESSAGE_MAP()
afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_REGISTERED_MESSAGE(wm_Find, OnFind)
END_MESSAGE_MAP()
LRESULT CMainFrame::OnFind(WPARAM wParam, LPARAM lParam) {
// 處理尋找/替換對話框消息
return 0;
}
RegisterWindowMessage 返回的 UINT 必須為全局/靜態變量,確保多模塊間一致。