高手进来看看。。。。。。

时间:2022-04-08 00:50:21
我用徐景周写的Word 插件框架(一个ATL在VCKBASE.net下可载到),然后我想在框架里面调用我自己写的一个ActiveX(MFC ActiveX).... 应该怎么写啊。。。。。

问了好多次,没有人能回答。。。。

8 个解决方案

#1


up

#2


#3


你在其他地方如何调用 MFC ActiveX 你在那个框架里就如何调用。
如果你不会调用 ActiveX 就去学习 ActiveX 。

#4


用对话框做容器的话就是一件很简单的事。 可要在ATL做的COM中是没有容器的。 还望多多指教???

#5


在http://www.xue68.com 搜索到过类似的解决方法

#6


没找到啊.

#7


在使用一个已注册的ActiveX控件之前,必须先用组件廊将该控件添加到应用程序中,步骤如下: 
  1.从Project菜单选择Add To Project下的Components and Controls。   

  2.在弹出的对话框中双击Registered ActiveX Control子目录,打开此目录。   

  3.选择你需要的控件,点击Insert按钮,弹出Confirm Classes对话框。  

  4.在列出的类名中选择需要的类(缺省为全选中,最好接受缺省设置),点击OK,关闭Confirm Classes对话框。   

  5.点击Close关闭组件廊,该控件的图标即加入到对话框编辑器的控件面板上。   

  这样,我们就可以在对话框中像使用Windows标准控件那样使用该控件了。但在某些应用中,你可能需要在非对话框容器(如应用程序的窗口)中嵌入ActiveX控件。这时没有对话框编辑器,我们应怎样在非对话框容器中使用ActiveX控件呢?   

  当组件廊将ActiveX控件添加到你的应用程序后,组件廊会创建一些包裹类(即在Confirm Classes对话框中列出的那些类)。其中有一个类的基类是CWnd,该类是控件的包裹类,它被用作控件与控件包容器之间的接口,有两个公有的Create成员函数:  

  virtual BOOL Create(LPCTSTR lpszClassName,  
  LPCTSTR lpszWindowName, DWORD dwStyle,  

   const RECT& rect, CWnd* pParentWnd, UINT nID,  
   CCreateContext* pContext = NULL) 
  和BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, 
   const RECT& rect, CWnd* pParentWnd, UINT nID, 
   CFile* pPersist = NULL, BOOL bStorage = FALSE, 
   BSTR bstrLicKey = NULL)  

  我们就可以使用该控件的包裹类的Create函数在非对话框容器中动态地创建此控件的实例。 

  步骤如下:(本例中欲加入的控件名为MSFlexGrid ,CMSFlexGrid是控件的包裹类,msflexgrid.h是包裹类的头文件)  

  1.在视类头文件(本例中为TestView.h)中的类定义前加上 
  #include “msflexgrid.h” 

 2. 在TestView.h中CTestView类定义的protected部分加上控件包裹类类型的成员变量声明: 
   class CTestView : public CView 
   { 
   ... 
   protected: 
   CMSFlexGrid m_fgrid; 
   ... 
   };  

  3. 用ClassWizard为类CTestView 添加消息WM_CREATE的处理函数CTestView::OnCreate,在此函数中,调用控件类CMSFlexGrid的Create函数:  

   int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
   { 
   if (CView::OnCreate(lpCreateStruct) == -1) 
   return -1; 
   // ****** Add your code below this line ********** // 
   m_fgrid.Create(NULL, WS_VISIBLE, 
   CRect(50,50,100,100), this, 0); //用this指针作为指向父窗口的指针    m_fgrid.SetCols(2); 
   m_fgrid.SetRows(10); 
   m_fgrid.SetTextMatrix(0,0,"序号"); 
   m_fgrid.SetTextMatrix(0,1,"姓名"); 
   // ****** Add your code above this line ********** // 
   return 0; 
   } 

  4.重新链接工程,运行。可以看到当应用程序的视窗生成时,控件也动态地生成了。 
   

  5.如果你以后还想改变控件的位置和大小,可以继承CWnd::MoveWindow()函数。例如,若想使控件充满整个窗口,并在父窗口移动和缩放时也随之移动和缩放,可以添加消息WM_SIZE的处理函数OnSize,并加入如下代码: 

  void CTestView::OnSize(UINT nType, int cx, int cy) 
   { 
   CView::OnSize(nType, cx, cy); 
   // TODO: Add your message handler code here 
   m_fgrid.MoveWindow(0,0,cx,cy); 
   }

#8


如果不支持MFC可以实现IOleContainer就可以了.

#1


up

#2


#3


你在其他地方如何调用 MFC ActiveX 你在那个框架里就如何调用。
如果你不会调用 ActiveX 就去学习 ActiveX 。

#4


用对话框做容器的话就是一件很简单的事。 可要在ATL做的COM中是没有容器的。 还望多多指教???

#5


在http://www.xue68.com 搜索到过类似的解决方法

#6


没找到啊.

#7


在使用一个已注册的ActiveX控件之前,必须先用组件廊将该控件添加到应用程序中,步骤如下: 
  1.从Project菜单选择Add To Project下的Components and Controls。   

  2.在弹出的对话框中双击Registered ActiveX Control子目录,打开此目录。   

  3.选择你需要的控件,点击Insert按钮,弹出Confirm Classes对话框。  

  4.在列出的类名中选择需要的类(缺省为全选中,最好接受缺省设置),点击OK,关闭Confirm Classes对话框。   

  5.点击Close关闭组件廊,该控件的图标即加入到对话框编辑器的控件面板上。   

  这样,我们就可以在对话框中像使用Windows标准控件那样使用该控件了。但在某些应用中,你可能需要在非对话框容器(如应用程序的窗口)中嵌入ActiveX控件。这时没有对话框编辑器,我们应怎样在非对话框容器中使用ActiveX控件呢?   

  当组件廊将ActiveX控件添加到你的应用程序后,组件廊会创建一些包裹类(即在Confirm Classes对话框中列出的那些类)。其中有一个类的基类是CWnd,该类是控件的包裹类,它被用作控件与控件包容器之间的接口,有两个公有的Create成员函数:  

  virtual BOOL Create(LPCTSTR lpszClassName,  
  LPCTSTR lpszWindowName, DWORD dwStyle,  

   const RECT& rect, CWnd* pParentWnd, UINT nID,  
   CCreateContext* pContext = NULL) 
  和BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, 
   const RECT& rect, CWnd* pParentWnd, UINT nID, 
   CFile* pPersist = NULL, BOOL bStorage = FALSE, 
   BSTR bstrLicKey = NULL)  

  我们就可以使用该控件的包裹类的Create函数在非对话框容器中动态地创建此控件的实例。 

  步骤如下:(本例中欲加入的控件名为MSFlexGrid ,CMSFlexGrid是控件的包裹类,msflexgrid.h是包裹类的头文件)  

  1.在视类头文件(本例中为TestView.h)中的类定义前加上 
  #include “msflexgrid.h” 

 2. 在TestView.h中CTestView类定义的protected部分加上控件包裹类类型的成员变量声明: 
   class CTestView : public CView 
   { 
   ... 
   protected: 
   CMSFlexGrid m_fgrid; 
   ... 
   };  

  3. 用ClassWizard为类CTestView 添加消息WM_CREATE的处理函数CTestView::OnCreate,在此函数中,调用控件类CMSFlexGrid的Create函数:  

   int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
   { 
   if (CView::OnCreate(lpCreateStruct) == -1) 
   return -1; 
   // ****** Add your code below this line ********** // 
   m_fgrid.Create(NULL, WS_VISIBLE, 
   CRect(50,50,100,100), this, 0); //用this指针作为指向父窗口的指针    m_fgrid.SetCols(2); 
   m_fgrid.SetRows(10); 
   m_fgrid.SetTextMatrix(0,0,"序号"); 
   m_fgrid.SetTextMatrix(0,1,"姓名"); 
   // ****** Add your code above this line ********** // 
   return 0; 
   } 

  4.重新链接工程,运行。可以看到当应用程序的视窗生成时,控件也动态地生成了。 
   

  5.如果你以后还想改变控件的位置和大小,可以继承CWnd::MoveWindow()函数。例如,若想使控件充满整个窗口,并在父窗口移动和缩放时也随之移动和缩放,可以添加消息WM_SIZE的处理函数OnSize,并加入如下代码: 

  void CTestView::OnSize(UINT nType, int cx, int cy) 
   { 
   CView::OnSize(nType, cx, cy); 
   // TODO: Add your message handler code here 
   m_fgrid.MoveWindow(0,0,cx,cy); 
   }

#8


如果不支持MFC可以实现IOleContainer就可以了.