用到一个别人的控件,别人提供了调用这个OCX的例子程序,但是以IDE环境中以摆放控件的操作方式的, 
  我不想这样,我想动态进行初始化并使用.但本人水平很低,不知道该如何做,请懂的人指导,谢谢 
    

解决方案 »

  1.   

    CWnd::CreateControl // This code is generated by the Control Wizard.
    // It wraps the call to CreateControl in the call to Create.
    class CGenocx : public CWnd
    {
    protected:
       DECLARE_DYNCREATE(CGenocx)
    public:
       CLSID const& GetClsid()
       {
          static CLSID const clsid
             = { 0x8a6bbfeb, 0xf9bb, 0x11d1, { 0xb9, 0xc9, 0x0, 
             0x60, 0x8, 0x93, 0xb0, 0xfe } };
          return clsid;
       }
       virtual BOOL Create(LPCTSTR lpszClassName,
          LPCTSTR lpszWindowName, DWORD dwStyle,
          const RECT& rect,
          CWnd* pParentWnd, UINT nID,
          CCreateContext* pContext = NULL)
       {
          return CreateControl(GetClsid(), lpszWindowName, 
          dwStyle, rect, pParentWnd, nID); 
       }
    ...
    };
      

  2.   

      楼上几位没有明白我的意思吧? 就我想要的方法,好象要用到CoInitialize,CoCreateInstance等类的方法,但
    我希望高手能提供个完整的调用例子. 谢谢
      

  3.   

    VC 中 OCX 控件介绍
    信息等级:  加入日期: 2006-11-20
    VC++的初学者可能会很羡慕VB或是C++Builder中那多得令人眼花缭乱且使用方便的控件。其实,VC++中可使用的控件更多,只不过在通常的主界面上看不到而已。如果打开Project菜单, 选择Add To Project选项,在随后出现的子菜单中,选择Components And Controls,随后就可在Components andControls Gallery对话框中的列表框中看到Developer Studio Components和Registered ActiveX Controls两个文件夹。随便打开一个文件夹,你会看到什么?这么多控件,够用了吧。选定一个,要加入,单击Insert按钮;要帮助,单击More Info按钮。也可以直接在对话框编辑器中,右键单击对话框空白处,选择Insert ActiveXControls选项,然后就自己挑选去吧。下面向大家介绍两个常用的控件作为例子。 1112346599(1)在前面介绍的位图按钮中,可以用该方式在对话框中加入颜色最多仅256色的位图,现在,利用Microsoft Forms 2.0 Image控件,你就可自由自在的使用真彩色位图了。方法如下: 1112346599右键单击要加入位图的对话框空白处,选择Insert ActiveX Controls选项,随后选择Microsoft Forms 2.0 Image控件,加入后,右键单击该控件,调整该控件的属性。在All标签列出的属性中,Picture属性决定显示那一幅位图。属性调整完毕后,再编译连接,就一切OK了。 
    1112346599(2)在你的程序中要具有Tips of the Day功能,那定能增色不少。像通用对话框一样,你无需自己去费时费力,Microsoft已经为你做好了,方法如下:打开Project菜单,选择Add To Project选项,在随后出现的子菜单中,选择Components And Controls,打开Developer Studio Components选择Tip of the Day,将其加入到Project中去。再编译连接运行,Tips of the Day出来了。不过此时Tips of the Day还没有任何内容。此时,需要打开project莱单,选择Add To Project选项,在打开的子菜单选择New,随后创建一个名为tips.txt的TXT文件,并加入到Project中去。用回车符来区分每一条Tip,注意,每条Tip不能以Tab跳格开头,且 长度不能超过1000个字符。这样,加入Tip of the Day就大功告成了。也许大家还记得,在用 
    AppWizard创建运用程序框架时,有一步询问程序是否需要ActiveX控件支持。 1112346599因此,如果在创建运用程序框架时没有包含这一特性,后来的Project就不能加入ActiveX控件了。但这也不是绝对的,利用函数AfxEnableControlContainer()就可补上这一特性,在运用程序的InitInstance()_函数中加入该函数,并在预编译文件StdAfx.h中加入include<Afxdisp.h> 即可。1112346599
      

  4.   

    使用OCX构件之前,必须登记注册,否则不能使用。安装VISUAL C++时,系统自动注册登记软件附带的OCX控件。如果不幸没有登记,那么请使用REGSVR32应用程序来注册。以VISUAL C++ 5.0为例,用AppWizard生成MFC应用程序分为六个步骤,其中第三个步骤中可以指定支持OLE控制,也就是我们要使用的OCX控件(是OLE的一种)。如果指定该选项,则AppWizard将自动向应用程序添加以下两处代码。一处是为了说明OLE自动类如ColeDispathcDriver,自动向Stdafx.h中加入头文件afxdisp.h二是在InitInstance函数中激活OLE控制容器:AfxEnableContainer();如果在利用AppWizard创建应用程序是未指定OLE控制选项,则可以手工加入以上两行代码。在生成应用框架后,首先应向应用程序加入OCX控件对应的类,如远程数据控件的缺省名为RDC,而数据表格的缺省名为MSDBGRID。加入的过程是选择Project菜单项,选择Add to Project,选择Components and Controls项,选择Registered ActiveX Controls项,双击你要加入的构件。然后,通常是在对话框中加入OCX控制,这时应在对话框中单击右键,选择Insert ActiveX Controls,选择你要加入的控件。这里以远程数据控件为例。可以在设计时设定属性,当然,在运行时刻再设置属性值更具有灵活性。属性中比较关键的是这几个:(1) CursotDriver:(2)DataSourceName (3)SQL。具体的设置见所附的程序。以下程序是一个无模式对话框的源代码:此程序段实现了一个与FOXPRO数据源相连接的远程数据控件和一个与远程数据库控件相连的浏览数据库用的表格。数据源(DataSource)名称为“档案”,其中包含几个表(Table),程序中选择的是表2。用户当然也可以很轻松的在运行时刻改变连接对应的SQL属性,以便能够浏览同一数据库的不同表格,或是不同数据库的不同表格。数据源的建立方法为:控制面板->32位ODBC->ADD…。// Datatab.cpp : implementation file#include "stdafx.h"#include "Datatab.h"#include <afxcmn.h>#include <afxcview.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif
    //////////////////////////////////////// CDatatab dialogCDatatab::CDatatab(CView * pView):CDialog(){m_pView = pView;}BOOL CDatatab::Create(){return CDialog::Create(CDatatab::IDD);}CDatatab::CDatatab(CWnd* pParent /*=NULL*/): CDialog(CDatatab::IDD, pParent){//{{AFX_DATA_INIT(CDatatab)//}}AFX_DATA_INIT}void CDatatab::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDatatab)DDX_Control(pDX, IDC_REMOTEDATACTL1, m_rdc1);DDX_Control(pDX, IDC_DBGRID1, m_grid1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDatatab, CDialog)//{{AFX_MSG_MAP(CDatatab)ON_WM_CLOSE()ON_WM_PAINT()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////// CDatatab message handlersvoid CDatatab::OnClose() {// TODO: Add your message handler code here and/or call defaultDestroyWindow(); CDialog::OnClose();}void CDatatab::OnPaint() {CPaintDC dc(this); // device context for painting// TODO: Add your message handler code here// Do not call CDialog::OnPaint() for painting messages}BOOL CDatatab::OnInitDialog() {CDialog::OnInitDialog();// TODO: Add extra initialization herem_rdc1.SetDataSourceName("档案");
    m_rdc1.SetSQL(_T("SELECT 姓名 年龄 出生日期,from 表2"));m_rdc1.SetCaption("数据仓库");m_rdc1.SetUserName(_T("admin"));m_rdc1.SetPassword(_T(""));m_rdc1.SetCursorDriver(1);m_rdc1.Refresh();LPUNKNOWN pCursor=GetDlgItem(IDC_REMOTEDATACTL1)->GetDSCCursor();ASSERT(pCursor!=NULL);m_grid1.SetDataSource(pCursor); //bind the gridm_grid1.BindProperty(0x9,GetDlgItem(IDC_REMOTEDATACTL1));return TRUE; // return TRUE unless you set the focus to a control}_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////// CDatatab message handlersvoid CDatatab::OnClose() {// TODO: Add your message handler code here and/or call defaultDestroyWindow(); CDialog::OnClose();}void CDatatab::OnPaint() {CPaintDC dc(this); // device context for painting// TODO: Add your message handler code here// Do not call CDialog::OnPaint() for painting messages}BOOL CDatatab::OnInitDialog() {CDialog::OnInitDialog();// TODO: Add extra initialization herem_rdc1.SetDataSourceName("档案");
    m_rdc1.SetSQL(_T("SELECT 姓名 年龄 出生日期,from 表2"));m_rdc1.SetCaption("数据仓库");m_rdc1.SetUserName(_T("admin"));m_rdc1.SetPassword(_T(""));m_rdc1.SetCursorDriver(1);m_rdc1.Refresh();LPUNKNOWN pCursor=GetDlgItem(IDC_REMOTEDATACTL1)->GetDSCCursor();ASSERT(pCursor!=NULL);m_grid1.SetDataSource(pCursor); //bind the gridm_grid1.BindProperty(0x9,GetDlgItem(IDC_REMOTEDATACTL1));return TRUE; // return TRUE unless you set the focus to a control}