開發 ActiveX 控件時,若希望控件本身以對話框或表單視圖形式呈現,而非僅在預設框架內繪製,需要特別處理視窗建立與繪製流程。本文整理在 ActiveX 中使用 CDialog 與 CFormView 的完整步驟,並補充 VS2008 環境下的偵錯與網頁測試實務,作為 MFC ActiveX 開發系列的實戰補充。
MyActiveX。CMyDialog。CMyActiveXCtrlCMyDialog m_myDlg;OnCreate 訊息處理器:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
OnCreate 中建立對話框:
m_myDlg.Create(IDD_MYDLG, this); // IDD_MYDLG 為對話框資源 ID
OnDraw 中調整對話框大小以填滿控件區域:
m_myDlg.MoveWindow(rcBounds, TRUE);
完成上述步驟後,即可在 ActiveX Control Test Container 中測試控件顯示效果。
使用 CFormView 與 CDialog 大體相似,但因 CFormView::Create 為 protected,需特別處理。
CFormView 的類別 CMyForm。在 CMyForm 類別定義中加入友元宣告:friend class CMyActiveXCtrl;
或在 CMyForm 中重載 Create 並設為 public。
CMyActiveXCtrlCMyForm* p_myForm;Debug Assertion Fail。OnCreate 訊息處理器(同 Dialog)。OnCreate 中動態建立 FormView:
p_myForm = new CMyForm();
p_myForm->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL);
OnDraw 中調整大小:
p_myForm->MoveWindow(rcBounds, TRUE);
同樣可在 ActiveX Control Test Container 中驗證。
VS2008 未內建 TSTCON32.exe,需自行編譯範例專案:
C:\Program Files\Microsoft Visual Studio 9.0\Samples\2052\AllVCLanguageSamples.zipC++\MFC\ole\TstConTCProps,再編譯 TstConTstCon 與 TCProps 的 StdAfx.h 加入:
#define _WIN32_WINNT 0x0600
.ocx 所在目錄是否包含所有相依 DLL本文整理自「對影成三人」博客,原文出處:https://ticktick.blog.51cto.com/823160/610784