MFC 对话框中动态加载OCX控件


以前在MFC中创建OCX控件后,再到对话框中加载用的都是看似简单但实际上最麻烦的办法:

 那是就是在对话框上右键->insert ActiveX control...,然后给插入的控件绑定一个变量,这时候MFC会自动生成一个对应的类,然后调用方法,相应事件都很简单。

但是如果这个OCX不成熟需要改动,比如加个接口,删掉某个接口,再需要重新编译,就需要先关闭调用的项目,如此反复的话会让人抓狂,经过多次尝试终于找到一个相对比较好的办法:

             使用向导添加类-MFC Class From ActiveX Control-File(选择从文件创建)-选择对应得ocx文件,这时会自动生成一个类,这个和以前的方式类似,里面有类似如下的函数:

             void ShowTest()
           {
               InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
           }


          long TestAddData(long num1, long num2)
        {
            long result;
            static BYTE parms[] = VTS_I4 VTS_I4 ;
            InvokeHelper(0x3, DISPATCH_METHOD, VT_I4, (void*)&result, parms, num1, num2);
            return result;
        }

1.普通接口调用

           在调用的对话框头文件中引入这个类的头文件,并定义一个变量如:

          CDTestX m_ctrTest;

          resource.h 中第一个ID :#define IDC_OCX_TEST                    1001

          在对话框的OnInitDialog函数中创建:

         m_ctrTest.Create("",WS_CHILD|WS_VISIBLE,CRect(0,0,100,200),this,IDC_OCX_TEST);
         m_ctrTest.ShowWindow(SW_SHOW);

         然后就可以在需要的地方调用其接口:

         .....

          m_ctrTest.ShowTest();

         .....


2.事件的响应:

          对对话框头文件中添加

                    DECLARE_EVENTSINK_MAP()

                    void Tes_EventTestxctrl1(long num);

          CPP文件中添加:

                    BEGIN_EVENTSINK_MAP(CXXXDlg, CDialogEx)
                        ON_EVENT(CXXXDlg, IDC_OCX_TEST, 2, CXXXDlg::Tes_EventTestxctrl1, VTS_I4)
                    END_EVENTSINK_MAP()


                    void CXXXDlg::Tes_EventTestxctrl1(long num)
                    {

                        CString str;
                        str.Format("Tes_Event:%d",num);

                        AfxMessageBox(str);
    
                     }

这样一来就不用关闭这个工程就可以重新编译ocx源码了,如果有添加接口可以自己在生成的类中自己添加

有一点需要注意

        InvokeHelper函数的第一个参数对应的就是ocx的接口ID

      ON_EVENT的第三个参数是事件的ID



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值