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
--类结构中,找到相应函数,右键-〉删除;
-------------------------------------
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
相关文章推荐
- 面向过程-事件驱动编程-消息机制【VC MFC】
- MFC/VC 消息机制
- [VC/MFC ] VC++实现拨号上网程序详解
- 孙鑫VC++讲座笔记-(3)MFC程序框架的剖析
- VC/MFC中计算程序运行时间
- VC MFC中线程同步对象的区别
- vc mfc 项目cmake配置
- MFC程序框架剖析(孙鑫VC++第三讲详解)
- VC----MFC对话框(3)【“逃跑”按钮的实现】
- VC++(MFC) 中的自定义消息
- 【VC参考手册】MFC教程
- VC/MFC 使用jsoncpp解析json格式内容
- 创建用户控件自定义用户消息及调用(vc,mfc,消息影射)
- VC(MFC)开发,控件界面开发,案例模板,V2.0正式发布,一例走天下
- VC 6 MFC 美化界面方法和技巧
- 实用!超强VC/MFC 常见问答收集(上)
- VC++动态链接库编程之MFC扩展 DLL
- Matlab VC 联合编程 控制台以及MFC中实现(二)
- afxres.h是mfc类库的头文件,可能是安装vc不正确。
- VC++ MFC 定时器应用