<span style="font-family: Arial, Helvetica, sans-serif;">控件窗口的建立过程(只取了函数中的关键代码):</span>
STDMETHODIMP COleControl::XOleObject::DoVerb(LONG iVerb, LPMSG lpmsg,
LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent,
LPCRECT lprcPosRect)
{
//OLEIVERB_INPLACEACTIVATE:
pThis->OnActivateInPlace((iVerb != OLEIVERB_INPLACEACTIVATE), lpmsg);
}
HRESULT COleControl::OnActivateInPlace(BOOL bUIActivate, LPMSG pMsg)
{
m_bInPlaceSiteEx = FALSE;
m_pInPlaceSite->OnInPlaceActivate(); //告诉容器要进行原地激活
m_pInPlaceSite->GetWindow(&hwndParent); //获得容器窗口
m_pInPlaceSite->GetWindowContext(&m_pInPlaceFrame, &m_pInPlaceDoc,&m_rcPos, &rcClip, &m_frameInfo);//获取容器实现IOleInPlaceFrame接口的对象
m_bInPlaceActive = CreateControlWindow(hwndParent, m_rcPos,rectClip); //(1)以容器窗口为父窗口,创建控件窗口
SendAdvise(OBJECTCODE_SHOWOBJECT); //(2)
}
(1):
BOOL COleControl::CreateControlWindow(HWND hWndParent, const CRect& rcPos,LPCRECT prcClip)
{
dwStyle = WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
dwExStyle = WS_EX_NOPARENTNOTIFY;
if ((!IsSubclassedControl() || m_bMsgReflect) && m_bAutoClip)
{
AfxDeferRegisterClass(AFX_WNDOLECONTROL_REG); //注册窗口类,见注
CreateEx(dwExStyle, AFX_WNDOLECONTROL, m_strText, dwStyle,rcPos.le