ActiveX控件编写(OCX),及属性页访问控件类对象

本文介绍了如何使用MFC向导生成ActiveX控件,并注册为*.ocx文件。强调了自定义对话框的添加方式,建议避免手动操作,而选择使用向导。同时讲解了属性页的属性持久化和获取,以及解决因包含其他ActiveX控件导致的Create失败问题,可通过在InitInstance中调用AfxEnableControlContainer()解决。

ActiveX控件编写:

由MFC向导直接生成ActiveX控件。编译即可得*.ocx控件。并注册到系统。

1.如需显示自定义对话框:

// <span style="font-family: Arial, Helvetica, sans-serif;">CMyCtrl</span><span style="font-family: Arial, Helvetica, sans-serif;">消息处理程序</span>

int <span style="font-family: Arial, Helvetica, sans-serif;">CMyCtrl</span>::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (COleControl::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	m_dlgMain.Create(IDD_DLG_MAIN,this);<span style="color: rgb(0, 204, 204); font-family: Arial, Helvetica, sans-serif;">//创建</span>
	m_dlgMain.ShowWindow(SW_SHOW);
 	
	return 0;
}

void CMyCtrl::OnDraw(
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	if (!pdc)
		return;

	// TODO: 用您自己的绘图代码替换下面的代码。
	m_dlgMain.m_strTitle = m_StrTitleName;<span style="color: rgb(0, 204, 204); font-family: Arial, Helvetica, sans-serif;">//更改标题</span>
	m_dlgMain.MoveWindow(rcBounds);<span style="color:#00cccc;">//将自定义对话框Move到该控件视即可</span>
}
2.添加自定义属性:

本人不建议手动添加,除非对微软的封装了解的比较透彻,否则还是用向导吧。孙鑫的书上写的是类向导,搞死我了,找到类试图,找到相应接口,右击添加属性、方法等。


3.属性页添加属性持久化及获取

CMyCtrl* CMyPropPage::GetControlClass()//获取控件类指针,这是微软官方给的代码
{
	CAlarmsDisplayCtrl *pMyCtrl;
	ULONG Ulong;

	// Get the array of IDispatch pointers that is stored in the property page.
	LPDISPATCH FAR *lpDispatch = GetObjectArray(&Ulong);

	// Get the CCmdTarget object that is associated with any one of the previous
	// array elements.
	pMyCtrl = (CAlarmsDisplayCtrl*)FromIDispatch(lpDispatch[0]);
	// Cleanup
	return pMyCtrl;
} 
链接: 微软官方解决办法
void CMyPropPage::DoDataExchange(CDataExchange* pDX)
{
	if(pDX->m_bSaveAndValidate==0)//初始化,load
	{
		// Get the array of IDispatchs stored in the property page
		CMyCtrl *pCtrl = GetControlClass();
		if (pCtrl)
		{
			m_strTitle = pCtrl->m_StrTitleName;
		}
	}
	DDP_PostProcessing(pDX);
	DDX_Control(pDX, IDC_EDIT_TITLE, m_edtTitle);

	DDP_Text(pDX,IDC_EDIT_TITLE,m_strTitle,_T("StrTitleName"));

	DDX_Text(pDX,IDC_EDIT_TITLE,m_strTitle);

	if(pDX->m_bSaveAndValidate !=0)//结束保存
	{
		CMyCtrl *pCtrl = GetControlClass();
		if(pCtrl)
		{
			pCtrl->m_StrTitleName = m_strTitle;
			pCtrl->SetModifiedFlag();
 			pCtrl->Invalidate();
		}
	}
}

如果获取到的控件指针一直是NULL请在控件的构造函数中添加:

CMyCtrl::CMyCtrl()
{
	InitializeIIDs(&IID_DMy, &IID_DMyEvents);
	// TODO: 在此初始化控件的实例数据。
	m_xInnerUnknown = 0; 
}
ActiveX控件的入门先到此。

如果控件中包含其他的ActiveX控件如MS Web Browser导致的Create失败,请在InitInstance中添加:AfxEnableControlContainer();








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值