MFC ACtiveX 自定义控件系列操作 动态加载 程序注册 等

项目需要把以前做的一个VC6自定义控件 放到vs2008上使用。

把vc6程序转为vs2008,重新编译一下,开始:

 

怎么在自定义控件程序中添加新方法?
如下图所示:

类视图 -> 自定义控件LIB -> _D -> 右键添加方法/属性 => 属性添加向导

MFC <wbr>ACtiveX <wbr>自定义控件系列操作 <wbr>动态加载 <wbr>程序注册 <wbr>等

 

 

怎么制定自定义控件的字体?

见博文: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    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风格的下一个控件。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值