以前在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