1.消息处理者
消息处理者是消息的处理函数的封装对象,处理函数可以是:
- 窗体成员函数
- 插件的成员函数
消息处理者指定方式:
- 指定的某种消息的处理者
- 指定某个消息的处理者
2.使用示例
- 按消息种类指定插件处理者
如:
MSG_FUNC_MAP CManagePlugin::func_[] =
{
{561,MT_CONFIRMATION,(MSGFUNC)&CManagePlugin::OnGetOrgStruct,"查询组织架构","查询组织架构",true},
};
表示561-MT_CONFIRMATION消息由CManagePlugin插件的OnGetOrgStruct函数处理
- 指定一种消息的处理者
CBaseClientModule::RegisterMsgHandler(MSG_TYPE_EX(MT_CONFIRMATION,751,0),new CFormMsgHandler(this,(FormMsgHandleFunc)&TFrmSysRunLog::OnReceiveMsg));
表示751-Confirmation由TFrmSysRunLog窗体的OnReceiveMsg函数处理
- 指定一个消息实例返回消息的处理者
CPluginHelper::Send(req,new CFormMsgHandler(this,(FormMsgHandleFunc)&TFrmAddRole::Do570))
表示req请求消息的返回消息由TFrmAddRole窗体的Do570函数处理
CBaseClientModule::Send(req,new CWndMsgHandler(handle,WM_SERVERMSG),timeout,cmd_id);
表示req由指定窗口(句柄为handle)的WM_SERVERMSG窗口消息映射函数处理.
3.消息处理者定义
- CFormMsgHandler
/// TForm消息处理器
/// 用于指定一个窗体函数作为消息的处理函数
struct CFormMsgHandler : public CMsgHandler {
TForm *form_;
FormMsgHandleFunc func_; ///< 消息处理函数
CFormMsgHandler(TForm *form,FormMsgHandleFunc fp):form_(form),func_(fp) {
owner_ = form->Handle;
}
int Handle(CMsg *msg) {
///< 由于CFormMsgHandler是在后台线程中调用,访问VCL存在线程安全性问题,不能直接调用窗体函数
///< 使用PostMessage可能存在访问已被关闭(销毁)的form_.
///< 所以,只能使用SendMessage.如果处理函数中有模态操作(如打开一个需要响应的窗口),这可能导致线程阻塞.
SendMessage(CBasePlugInModule::async_fc_wnd_,WM_ASYNC_FUNC_CALL,2,(LPARAM)new CFormFuncCallPara(form_,func_,msg));
return 0;
// return (form_->*func_)(msg);
}
};
- CWndMsgHandler
struct CWndMsgHandler : public CMsgHandler {
HWND handle_;
unsigned long wnd_msg_id_; ///< Windows消息ID
CWndMsgHandler(HWND handle,unsigned long wnd_msg_id):handle_(handle),wnd_msg_id_(wnd_msg_id) {
owner_ = handle_;
}
int Handle(CMsg *msg) {
msg->Duplicate();
if (!::PostMessage(handle_,wnd_msg_id_,(WPARAM)msg,NULL))
msg->Release();
return 0;
}
};