ActiveX控件空对象, 创建窗体
RecreateControlWindow
void COleControl::RecreateControlWindow()
{
if (m_bInPlaceActive)
{
BOOL bUIActive = m_bUIActive;
m_xOleInPlaceObject.InPlaceDeactivate();
DestroyWindow();
OnActivateInPlace(bUIActive, NULL);
}
#ifdef _AFXDLL
else if (m_bOpen)
{
DestroyWindow();
CRect rectClient;
m_pWndOpenFrame->GetClientRect(&rectClient);
CreateControlWindow(m_pWndOpenFrame->m_hWnd, rectClient, rectClient);
}
#endif //_AFXDLL
else
{
HWND hWndParent = _AfxGetParkingWindow();
if (hWndParent != NULL)
{
DestroyWindow();
int cx;
int cy;
GetControlSize(&cx, &cy);
CRect rect(0, 0, cx, cy);
CreateControlWindow(hWndParent, rect);
}
}
}
最终使用的是
class CParkingWnd : public CWnd
{
public:
CParkingWnd()
{ AfxDeferRegisterClass(AFX_WNDOLECONTROL_REG);
CreateEx(WS_EX_NOPARENTNOTIFY|WS_EX_TOOLWINDOW,
AFX_WNDOLECONTROL, NULL, WS_VISIBLE|WS_CHILD,
-1000, -1000, 1, 1, ::GetDesktopWindow(), 0); }
virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
protected:
CMapPtrToPtr m_idMap;
};