zoukankan      html  css  js  c++  java
  • 几个模拟OLE事件注册、调用的宏

    最近遇到一个要求,将原来的OCX控件,替换成直接的DLL调用。

    遇到OLE的事件回调,写了三个宏,用于简化代码

    #define OLE_ENVENT_IN_CLASS_ONE(event_name, func_ret_type, param_type , param_name) 
    public:                                      
    typedef struct event_name##Struct {          
        CWnd* pThis;                             
        void (CWnd::* event_name##Callback)( param_type param_name ); 
    } event_name##Struct;                                 
    protected:                                            
        event_name##Struct __ole_event_##event_name##StructSt; 
    public:                                                    
        void _Ole_Event_Set##event_name(const event_name##Struct stCallback) { __ole_event_##event_name##StructSt = stCallback;}; 
        func_ret_type _Ole_Event_Call##event_name ( param_type param_name ) {        
            if (NULL != __ole_event_##event_name##StructSt . event_name##Callback) { 
                (__ole_event_##event_name##StructSt .pThis ->* __ole_event_##event_name##StructSt.event_name##Callback)( param_name ); 
            } 
        };
    
    #define CALL_OLE_EVENT(event_name, param_name)   
        _Ole_Event_Call##event_name(param_name);
    
    #define SET_OLE_EVENT_TO_OBJ(event_class, event_name, event_obj, pThis, func_name, param_type , param_name ) 
        event_class :: event_name##Struct __temp_ole_event_set##event_name = {(CWnd*)pThis, (void (CWnd::* )( param_type param_name )) & func_name }; 
        (event_obj) -> _Ole_Event_Set##event_name( __temp_ole_event_set##event_name );

    在类定义中,插入相应的事件

    	OLE_ENVENT_IN_CLASS_ONE(EventCallback, void, LPCTSTR, content)
    

     事件调用处如此执行

        void cwDetectCallback(LPCTSTR content)
        {
    #ifndef CW_LIB_DEF
            FireEvent(eventidcwDetectCallback, EVENT_PARAM(VTS_BSTR), content);
    #else
            CALL_OLE_EVENT(EventCallback, content);
    #endif
        }

    调用处,原OLE控件初始化处,如下设置

        auto ret = activex_.cwInitControl(_T(""));
    
        //模拟事件调用
        SET_OLE_EVENT_TO_OBJ(CStrCloudWalkControlCtrl, EventCallback, &activex_, this, CCloudWalkLiveDetectDlg::OnLiveDetectCallbackFunc, LPCTSTR, content);

    回调函数正常定义。

  • 相关阅读:
    vue axios的使用
    html5 css写出一个实心三角形和空心三角行
    弹出新页面并使整个旧页面背景变暗功能的实现代码
    radio 单选按钮 选中多个
    搭建脚手架cli2.x环境
    页面滚动条位置触发事件
    DataGridView行号发生变化 使用的事件
    eclipse git 忽略文件
    eclipse git 分享项目到GitHub上
    eclipse git 创建新分支 合并分支 删除分支
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11124787.html
Copyright © 2011-2022 走看看