关于在ATL中自定义消息

来源:互联网 发布:苹果手机作图软件 编辑:程序博客网 时间:2024/05/03 02:46

在ATL中自定义消息的机制与MFC类似,使用消息映射。
消息映射
为了确保我们能够在CWindowImpl-derived class中处理Windows消息,ATL从抽象基类CMessageMap中继承。CMessageMap声明一个纯虚函数—— ProcessWindowMessage,整个类如下:
class ATL_NO_VTABLE CMessageMap  
{  
public:  
   virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg,  
          WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD dwMsgMapID) = 0;  
};

你的CWindowImpl-derived class中必须实现ProcessWindowMessage函数,该函数在CWindowImpl基类CWindowImplBaseT中被WindowProc调用。如果ProcessWindowMessage返回TRUE,消息已经被你的基类处理了,WindowProc将不会进行缺省消息处理,如果返回FALSE,WindowProc就会进行缺省消息处理。
BEGIN_MSG_MAP(CMainFrame)  
   MESSAGE_HANDLER(WM_DESTROY,   OnDestroy)  
END_MSG_MAP()    

消息处理者将处理消息或者失败,导致缺省处理。在处理函数被调用之前,句柄参数被缺省置为TRUE。处理函数返回且ProcessWindowMessage退出后,你能够手动将它设置为FALSE( as OnDestroy does)来允许缺省处理。

针对标准Windows消息、WM_NOTIFY消息和WM_COMMAND消息,ATL有很多消息处理宏供选择,基本宏类型有MESSAGE_HANDLER、NOTIFY_HANDLER和COMMAND_HANDLER。消息队列用相应的宏来处理,比如:MESSAGE_RANGE_HANDLER、NOTIFY_RANGE_HANDLER和COMMAND_RANGE_HANDLER。最简单的增加消息映射处理的方法是在类上面单击右键,从弹出菜单上选择添加Windows消息处理,VC则会插入正确的消息宏。你不能使用类向导添加ATL消息映射处理。下面是有用的消息处理宏的概要:
MESSAGE_HANDLER映射一个标准Windows消息到一个处理函数。  
MESSAGE_RANGE_HANDLER映射一批标准Windows消息到一个处理函数。
COMMAND_HANDLER映射一个WM_COMMAND消息到一个处理函数,比如通知消息、菜单消息、控件消息或者加速键消息。  
COMMAND_ID_HANDLER映射一批WM_COMMAND消息到一个处理函数,比如通知消息、菜单消息、控件消息或者加速键消息。  
COMMAND_CODE_HANDLER映射一个WM_COMMAND通知消息到一个处理函数。  
COMMAND_RANGE_HANDLER映射一批WM_COMMAND通知消息到一个处理函数,比如通知消息、菜单消息、控件消息或者加速键消息。    
NOTIFY_HANDLER映射一个WM_NOTIFY消息到一个处理函数,比如:通知消息、控件标识。    NOTIFY_ID_HANDLER映射一批WM_NOTIFY消息到一个处理函数,比如:通知消息、控件标识。  
NOTIFY_CODE_HANDLER 映射一个WM_NOTIFY消息到一个处理函数,比如:通知消息。
NOTIFY_RANGE_HANDLER映射一批WM_NOTIFY消息到一个处理函数,比如:控件消息。
 

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn