比如我有一个ActiveX控件A,有界面.我自己想写一个控件,要求自己的控件界面是A的界面,而且也能调用A的接口.如何实现?
第一次写ActiveX...
第一次写ActiveX...
解决方案 »
- 如何判断系统从Ctrl+atl+del登录界面回到桌面
- 怎样在监控视频中加时间
- 新手求助,请问VC++连接文件数据源一般是什么类型的文件。
- DestroyWindow,DeleteObject 之前需要判断对象是否为NULL吗?之后需要将对象置NULL吗?
- 求助:我想写个DLL,这个DLL还需要用到其他DLL,还有这个DLL中有个类的对象。问题如下:
- 新手小问题求助 很容易得分··求帮助
- vc++和vc++.net有什么区别,好像大家对vc.net关注的很少啊
- 完成端口的客户端异常断开检测
- ###散分!大家来讨论当今IT行业的最新技术及应用,来者有分!!!###
- 有谁用wdm做过视频捕捉???
- 寻找 pale(态度很重要)
- 发挥你的思想,解决均匀选数的问题
然后在你的新项目里调节控件A啊.
具体的可以使用:
HRESULT CreateControl( DWORD dwResID, IStream* pStream = NULL, IUnknown** ppUnkContainer = NULL );
这个函数创建啊,具体的研究一下MSDN吧,里面都写得很清楚.
在使用一个已注册的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的处理函数CTestV
iew::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);
}
原文:http://www.smth.edu.cn/bbsanc.php?path=%2Fgroups%2Fdevelop.faq%2FVisualC%2FVC_NEW_OLDVC%2FBook%2FControl%2FG.1025614734.a0