原文地址: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();