(轉發)ActiveX控件編寫(OCX),及屬性頁訪問控件類對象

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章