.ocx);WM_* 通知**,改為**激發事件 (Event)**;Click、KeyDown;Create 實為載入程式碼 + 就地啟動,再建立自身視窗;.ocx (DLL),容器透過登錄表 + COM 載入。.ocx 至目標機;regsvr32 xxx.ocx 註冊;CWnd 衍生包裝類,含屬性/方法對應函數、建構函數支援動態建立。所有成員函數內部呼叫 CWnd::InvokeHelper:
void InvokeHelper(
DISPID dwDispID, // 方法/屬性的 Dispatch ID (由控件提供者定義)
WORD wFlags, // 呼叫目的
VARTYPE vtRet, // 返回值型別
void* pvRet, // 返回值緩衝區
const BYTE* pbParamInfo, // 參數型別資訊
... // 參數列表
);
wFlags 常值:
DISPATCH_METHOD:呼叫方法;DISPATCH_PROPERTYGET:讀屬性;DISPATCH_PROPERTYPUT:寫屬性 (by value);DISPATCH_PROPERTYPUTREF:寫屬性 (by reference)。vtRet 對照:VT_EMPTY(void)、VT_I2(short)、VT_I4(long)、VT_R4(float)、VT_R8(double)、VT_CY(CY)、VT_DATE(DATE)、VT_BSTR(BSTR)、VT_DISPATCH(LPDISPATCH)...
DoModal/Create 前生效;Get/Set 存取。.ocx;regsvr32;// 對話框資源放入控件 → ClassWizard 產生 CMyAxCtrl 包裝類
// 成員變數 m_ctrl (CMyAxCtrl)
// 動態建立 (非對話框)
CMyAxCtrl* pCtrl = new CMyAxCtrl;
pCtrl->Create(NULL, WS_VISIBLE|WS_CHILD, rect, this, IDC_MYCTRL);
// 呼叫方法
pCtrl->SomeMethod(param1, param2);
// 存取屬性
long val = pCtrl->GetSomeProperty();
pCtrl->SetSomeProperty(newVal);
// 事件處理:ClassWizard 在包裝類產生事件處理函數
// 如 void OnClickEvent(short button, short shift, long x, long y)
hWnd,容器與控件間有 MFC 代理層;VT_EMPTY);DestroyWindow + delete。