客户端消息处理机制


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;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值