ATL的一个复合控件,嵌入IE的一个网页的IFRAME(此IFRAME没有充满网页,占右下的一部分)后,网页加载时IE的视图区左上角会先显示灰色的与OCX大小一样的灰色区域,网页加载完后,ocx区域才回到正确的IFRAME的区域,我试了不编写任何代码的OCX都有这个问题,请问如何解决?

解决方案 »

  1.   

    你把ocx的size默认为 1 x 1的  是不是就看不到了    SetInitialSize(1, 1);          
      

  2.   

    我是ATL复合控件,没有用MFC,SetInitialSize(1, 1); 用户了啊!:(
      

  3.   

    我在复合控件的构造函数里加入如下代码也没反应:
    SIZE sz = { 1,1 };
    // convert pixels to himetric
    AtlPixelToHiMetric (&sz, &m_sizeExtent);
    // store natural extent
    m_sizeNatural = m_sizeExtent;
      

  4.   

    // CMyControl is derived from CComControl
       STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
       {
          if (pClientSite)
          {
             RECT rc = {0,0,0,0};
             // Don't have access to the container's window so just use the
             // desktop.  Window will be resized correctly during in-place
             // activation.
             HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc);
             _ASSERT (hWnd);
          }
          return IOleObjectImpl<CMyControl>::SetClientSite (pClientSite);
       }   HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
       {      // Get the container's window.
          _ASSERT (m_spClientSite);
          LPOLEINPLACESITE pInPlaceSite = NULL;
          HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite,
                                                      (void       **)&pInPlaceSite);
          _ASSERT (SUCCEEDED (hr) && pInPlaceSite);
          HWND hParent = NULL;
          hr = pInPlaceSite->GetWindow (&hParent);
          _ASSERT (SUCCEEDED (hr) && hParent);
          pInPlaceSite->Release ();
          // Set container window as our parent window
          SetParent (hParent);
          return CComControlBase::InPlaceActivate(iVerb, prcPosRect);
       }
      

  5.   

    // CMyControl is derived from CComControl
       STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
       {
          if (pClientSite)
          {
             RECT rc = {0,0,0,0};
             // Don't have access to the container's window so just use the
             // desktop.  Window will be resized correctly during in-place
             // activation.
             HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc);
             _ASSERT (hWnd);
          }
          return IOleObjectImpl<CMyControl>::SetClientSite (pClientSite);
       }   HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
       {      // Get the container's window.
          _ASSERT (m_spClientSite);
          LPOLEINPLACESITE pInPlaceSite = NULL;
          HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite,
                                                      (void       **)&pInPlaceSite);
          _ASSERT (SUCCEEDED (hr) && pInPlaceSite);
          HWND hParent = NULL;
          hr = pInPlaceSite->GetWindow (&hParent);
          _ASSERT (SUCCEEDED (hr) && hParent);
          pInPlaceSite->Release ();
          // Set container window as our parent window
          SetParent (hParent);
          return CComControlBase::InPlaceActivate(iVerb, prcPosRect);
       }