原文地址:ActiveX控件编写(OCX),及属性页访问控件类对象
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.属性页添加属性持久化及获取
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控件如MS Web Browser导致的Create失败,请在InitInstance中添加:AfxEnableControlContainer();