项目需要把以前做的一个VC6自定义控件 放到vs2008上使用。
把vc6程序转为vs2008,重新编译一下,开始:
怎么在自定义控件程序中添加新方法?
如下图所示:
类视图 -> 自定义控件LIB -> _D -> 右键添加方法/属性 => 属性添加向导
怎么制定自定义控件的字体?
见博文:http://blog.sina.com.cn/s/blog_4b3c1f950102dtuo.html (主要是第二部分)
怎么使用自定义控件呢?
1 首先需要注册一下:
命令:注册 regsvr32 **.ocx
注销 regsvr32 -u **.ocx
2 静态使用:
工具箱设置 -> com组件 -> 添加控件进入工具箱 -> 将控件拖入窗口 -> 控件右键 添加变量
=> 自动引入.h .cpp
=> 若没有自动引入.h .cpp,项目右键 -> 添加 ActiveX自定义控件的MFC类 -> 手动关联类对象与控件资源
3 动态使用:
首先,项目右键->添加 ActiveX自定义控件的MFC类->定义变量
然后:
In MFC
Add class from ActiveX control, and there will be a wrapper class, say CMyControl: public CWnd, which help
control the Activex control.
Dynamically call CMyControl.CreateControl (使用方法,见补充)
In Win32
CoCreateInstance(CLSID, ..&pUnk);
pUnk-> QueryInterface(IID_IOleInPlaceObject, &pInplaceObj);
pInplaceObj-> GetWindow(hCtrlWnd);
Call SetParent, SetWindowPos to add the control to your UI window
In ATL
AtlAxCreateControl
如何通过程序进行OCX的注册与注销
方法一:
::WinExec( "Regsvr32.exe YourControl.OCX ",SW_HIDE);
方法二:
system("CMD命令语句"); //使用system方法就跟在cmd窗口中输入命令一样,需要#include "stdlib.h ",弊端:CDM窗口会闪一下
方法三:
步骤:
1. 使用Windows API函数LoadLibrary载入ActiveX控件;
2. 使用GetProcAddress函数获取ActiveX控件中注册函数DllRegisterServer(注销函数为DllUnregisterServer)指针;
3. 调用注册函数DllRegisterServer(或注销函数DllUnregisterServer)
注册示例代码:
void CMainFrame::OnRegisterReg()
{
//ActiveX控件的路径及文件名
LPCTSTR pszDllName= "toweratl.ocx ";
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox( "不能载入Dll文件! ", "结果 ",MB_OK);
return;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress (hLib,_T( "DllRegisterServer "));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox( "调用DllRegisterServer 失败! ", "结果 ",MB_OK);
FreeLibrary(hLib);
return;
};
MessageBox( "注册成功 ", "结果 ",MB_OK);
}else
MessageBox( "调用DllRegisterServer失败! " , "结果 ",MB_OK);
}
注销示例代码:
“注销ActiveX控件”菜单项响应函数的编写方法同上,代码也相似,只是将
“lpDllEntryPoint=GetProcAddress (hLib,_T( "DllRegisterServer "));”改成:
lpDllEntryPoint = GetProcAddress (hLib,_T( "DllUnregisterServer "))。
如何通过程序判断OCX是否已经注册
if(RegOpenKeyEx(HKEY_CLASSES_ROOT,"ActiveX.ActiveXControl\\Clsid ",0,KEY_READ,&hKey)!=ERROR_SUCCESS)
{
//没有注册
}
ActiveX.ActiveXControl为控件的名称和内部名称
如何调试自定义控件
在VS2008中没有找到像VC6中的那个调试入口,网上有说可以重新编译一下系统自带的容器(见:http://blog.csdn.net/candyliuxj/article/details/6876242),我没试过。
我的做法:新建一个工程,其中嵌入我们的控件,然后,回到控件工程,设置调试命令行为,容器工程exe,然后F5进行调试即可。
注意:在进行调试修改时,需要把容器工程关闭,这样就可以反复进行修改/编译/调试了。
补充:
CWnd::CreateControl
BOOL CWnd::CreateControl(
LPCTSTR lpszClass,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CFile* pPersist = NULL,
BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL
);
BOOL CWnd::CreateControl(
REFCLSID clsid,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CFile* pPersist = NULL,
BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL
);
返回值:
如果成功,则返回非零值;否则返回0。
参数:
lpszClass
这个字符串可能包含了该类的OLE的“短名”(ProgID),例如,“CIRC3.Circ3Ctrl.1”。这个名字应该与控件注册的名字相匹配。或者,这个字符串可能包含
了CLSID的字符串形式,包括在大括号内,例如,“{9DBAFCCF-592F-101B-85CE-00608CEC297B}”。在其它情况下,CreateControl将该字符串转换为对应的类ID。
lpszWindowName
指向要显示在控件中的文本的指针。设置了控件的标题或文本属性(如果有)的值。如果该指针为NULL,则不改变控件的标题或文本属性。
dwStyleWindows
风格。可能的取值在说明部分列出。
rect
指定了控件的大小和位置。它可以是一个CRect对象,也可以是一个RECT结构。
pParentWnd
指定了控件的父窗口。它不能为NULL。
nID
指定了控件的ID。
pPersist
指向一个CFile对象的指针,其中包含了控件的永久状态。缺省值为NULL,表明控件在初始化自己的时候并不读任何永久性的存储。如果该参数不是NULL,它必须是一个
CFile
派生类对象的指针,其中包含了控件的永久数据,可以是流的形式,也可以是存储的形式。这些数据必须是在客户以前的活动中保存的。CFile对象中还可以包含其它数据,
但是当调用CreateControl的时候,它的读写指针必须定位在永久数据的第一个字节。
bStorage
指明pPersist中的数据是被解释为IStorage数据还是IStream数据。如果pPersist中的数据是一种存储,则bStorage
应该为TRUE。如果pPersist中的数据是一个流,则
bStorage
应该是FALSE。缺省值为FALSE。
bstrLicKey
可选的许可键数据。这个数据仅在创建需要运行时许可的控件时才需要。如果该控件支持许可,要成功地创建控件,你必须提供许可键。缺省的值为NULL。
clsid
控件的唯一的类ID。
说明:
使用这个成员函数来创建一个OLE控件,在MFC程序中,它用一个CWnd对象来代表。CreateControl 与 CWnd::Create函数类似,CWnd::Create为CWnd创建一个窗口。CreateControl创建一个OLE控件,而不是其它的普通窗口。
CreateControl仅支持Windows的dwStyle风格的一个子集:
· WS_VISIBLE 创建一个最初可见的窗口。如果你希望该控件立即可见,向普通窗口一样,则需要这个风格。
· WS_DISABLED 创建一个最初被禁止的窗口。被禁止的窗口不能接收用户的输入。如果控件具有Enable属性,则可以设置这个风格。
· WS_BORDER 创建一个带有细边框的窗口。如果控件具有BorderStyle属性,则可以设置这个风格。
· WS_GROUP 指定了一组控件中的第一个控件。用户可以在组中使用方向键来把键盘焦点从一个控件转移到另一个控件。在第一个控件之后所有用WS_GROUP风格定义的控件都属于
同一组。下一个具有WS_GROUP风格的控件将结束这个组并开始一个新组。
· WS_TABSTOP 指明当用户按下TAB键时,控件可以接收键盘焦点。按下TAB键时键盘焦点转移到具有WS_TABSTOP风格的下一个控件。