您的位置:首页 > 其它

vc_mfc_消息机制

2011-04-12 10:27 78 查看
1,删除消息响应函数
--类结构中,找到相应函数,右键-〉删除;

-------------------------------------
2,mfc消息映射机制
1,CWnd类定义virtual 窗口响应函数
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
2,CWnd::WindowProc()
--CWnd::OnWndMsg() //完成消息的派发;
--DefWindowProc(message, wParam, lParam); //若上述不做处理,调用默认处理;
3,CWnd::OnWndMsg()
--WM_COMMAND //调用CWnd::OnCommand(wParam, lParam)
--WM_NOTIFY //调用OnNotify(wParam, lParam, &lResult)
--WM_ACTIVATE //调用_AfxHandleActivate(this, wParam, CWnd::FromHandle((HWND)lParam));
--WM_SETCURSOR //调用_AfxHandleSetCursor(this, (short)LOWORD(lParam), HIWORD(lParam))CWnd::OnCommand(wParam, lParam)
--windowless ActiveX controls //调用m_pCtrlCont->HandleWindowlessMessage()

--获取MessageMap //[DECLARE_MESSAGE_MAP]中定义并获取;
AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap();
--消息映射
switch (lpEntry->nSig)
case AfxSig_l_p:
case AfxSig_b_D_v:
case AfxSig_b_b_v:
case AfxSig_b_u_v
case AfxSig_b_W_COPYDATASTRUCT:
...
--消息入口
#define ON_COMMAND(id, memberFxn) /
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, /
static_cast (memberFxn) },
...
--afxmsg.h中为消息定义的enum类型
enum AfxSig
{
AfxSig_end = 0,
...
AfxSigCmd_v,
...
}
4,XJ总结
1,构建类的消息映射内容 _messageEntries[]
--DECLARE_MESSAGE_MAP()
--BEGIN_MESSAGE_MAP(Cmfc1View, CView)
--END_MESSAGE_MAP()
2,填充_messageEntries[]
--查看 BEGIN_MESSAGE_MAP/END_MESSAGE_MAP 定义和 ON_COMMAND 定义;
--向 _messageEntries[] 中添加3条信息,添加的内容 ON_COMMAND 指定;
-- _messageEntries[] 中存放 AFX_MSGMAP_ENTRY 结构
BEGIN_MESSAGE_MAP(Cmfc1View, CView)
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
END_MESSAGE_MAP()
3,消息映射过程
--CWnd::OnWndMsg()
1,调用到此过程前,有上述 1,2 两个步骤已经将 _messageEntries[] 构建完成;
-- AFX_MSGMAP_ENTRY 结构中 --nSig 字段代表具体消息; --pfn字段指向处理函数;
2,获取MessageMap
--AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap();
-- [DECLARE_MESSAGE_MAP]中定义并获取;
static const AFX_MSGMAP messageMap = /
{ &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; /
--从定义中可以看出, messageMap的两部分:
1,AFX_MSGMAP*,指向基类的messageMap;
2,_messageEntries[0],即_messageEntries[]的入口点;
--该数组中存放的内容为本类可以处理的message;
--数组的结尾由 END_MESSAGE_MAP() 给出;
--messageMap最终组织起一个 _messageEntries[] 网;可以获取自身和基类的 _messageEntries[];
3,遍历MessageMap,完成消息查找和函数处理
1,找到消息入口点;
--通过messageMap,先找基类,而后自身;
--最终都要操作 _messageEntries[] ,只是要区分对待基类还是自身的 _messageEntries[];
2,查找message对应的 nSign;
3,调用相应 nSign对应的函数 pfn 并调用;
-------------------------------------
3,mfc中消息结构

-------------[MessageMapFunctions]
union MessageMapFunctions
{
AFX_PMSG pfn;
BOOL (AFX_MSG_CALL CCmdTarget::*pfn_b_D)(CDC*);
BOOL (AFX_MSG_CALL CCmdTarget::*pfn_b_b)(BOOL);
BOOL (AFX_MSG_CALL CCmdTarget::*pfn_b_u)(UINT);
...
}

-------------[AFX_MSG_CACHE]
struct AFX_MSG_CACHE
{
UINT nMsg;
const AFX_MSGMAP_ENTRY* lpEntry;
const AFX_MSGMAP* pMessageMap;
};

---------------[AFX_PMSG]
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);

---------------[AFX_DISPMAP_ENTRY]
struct AFX_DISPMAP_ENTRY
{
LPCTSTR lpszName; // member/property name
long lDispID; // DISPID (may be DISPID_UNKNOWN)
LPCSTR lpszParams; // member parameter description
WORD vt; // return value type / or type of property
AFX_PMSG pfn; // normal member On or, OnGet
AFX_PMSG pfnSet; // special member for OnSet
size_t nPropOffset; // property offset
AFX_DISPMAP_FLAGS flags;// flags (e.g. stock/custom)
};

---------------[AFX_EVENTSINKMAP_ENTRY]
struct AFX_EVENTSINKMAP_ENTRY
{
AFX_DISPMAP_ENTRY dispEntry;
UINT nCtrlIDFirst;
UINT nCtrlIDLast;
};

---------------[AFX_MSGMAP_ENTRY]
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT_PTR nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};

---------------[AFX_MSGMAP]
struct AFX_MSGMAP
{
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
const AFX_MSGMAP_ENTRY* lpEntries;
};

-------------------------------------
4,mfc消息映射关键宏

-----------------------------------------------------------------------------------------------[DECLARE_INTERFACE_MAP]
#ifdef _AFXDLL
#define DECLARE_INTERFACE_MAP() /
private: /
static const AFX_INTERFACEMAP_ENTRY _interfaceEntries[]; /
protected: /
static const AFX_INTERFACEMAP interfaceMap; /
static const AFX_INTERFACEMAP* PASCAL GetThisInterfaceMap(); /
virtual const AFX_INTERFACEMAP* GetInterfaceMap() const; /

#else
#define DECLARE_INTERFACE_MAP() /
private: /
static const AFX_INTERFACEMAP_ENTRY _interfaceEntries[]; /
protected: /
static const AFX_INTERFACEMAP interfaceMap; /
virtual const AFX_INTERFACEMAP* GetInterfaceMap() const; /

#endif

-----------------------------------------------------------------------------------------------[DECLARE_MESSAGE_MAP]

--定义BEGIN_MESSAGE_MAP()
--定义END_MESSAGE_MAP()
--定义BEGIN_TEMPLATE_MESSAGE_MAP()
--定义DECLARE_MESSAGE_MAP()
--定义_messageEntries[]
--定义messageMap
--定义GetThisMessageMap();

#define DECLARE_MESSAGE_MAP() /
protected: /
static const AFX_MSGMAP* PASCAL GetThisMessageMap(); /
virtual const AFX_MSGMAP* GetMessageMap() const; /

#define BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass) /
PTM_WARNING_DISABLE /
template < typename type_name > /
const AFX_MSGMAP* theClass< type_name >::GetMessageMap() const /
{ return GetThisMessageMap(); } /
template < typename type_name > /
const AFX_MSGMAP* PASCAL theClass< type_name >::GetThisMessageMap() /
{ /
typedef theClass< type_name > ThisClass; /
typedef baseClass TheBaseClass; /
static const AFX_MSGMAP_ENTRY _messageEntries[] = /
{

#define BEGIN_MESSAGE_MAP(theClass, baseClass) /
PTM_WARNING_DISABLE /
const AFX_MSGMAP* theClass::GetMessageMap() const /
{ return GetThisMessageMap(); } /
const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() /
{ /
typedef theClass ThisClass; /
typedef baseClass TheBaseClass; /
static const AFX_MSGMAP_ENTRY _messageEntries[] = /
{

#define END_MESSAGE_MAP() /
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /
}; /
static const AFX_MSGMAP messageMap = /
{ &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; /
return &messageMap; /
} /
PTM_WARNING_RESTORE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: