ITPub博客

首页 > 应用开发 > IT综合 > ATL问题集-#22 ~ #23 (转)

ATL问题集-#22 ~ #23 (转)

原创 IT综合 作者:worldblog 时间:2007-12-08 09:46:13 0 删除 编辑
ATL问题集-#22 ~ #23 (转)[@more@]

/*此文是我将网上的一些文章,自已遇到的问题进行整理,有些是翻译,所有只供学习讨论,如有版权还属于原作者——作者:黄森堂*/

#22 如何取得控件的HWND?

  HWND CMyOcx::GetApplicationWindow()
  {
  HWND  hwnd = NULL;
  HRESULT hr;
 
  //*****这段代码在VC++ v4.1工作
  if (m_pInPlaceSite != NULL)
  {
  m_pInPlaceSite->GetWindow(&hwnd);
  return hwnd;
  }
 
  //****** 这段代码在Visual Basic工作
  LPOLECLIENTSITE pOleClientSite = GetClientSite();
 
  if ( pOleClientSite )
  {
  IOleWindow* pOleWindow;
  hr = pOleClientSite->QueryInterface( IID_IOleWindow, (LPVOID*) 
  &pOleWindow );
 
  if ( pOleWindow )
  {
  pOleWindow->GetWindow( &hwnd );
  pOleWindow->Release();
  return hwnd;
  }
  }
 
  return NULL;
  }

#23 为什么AmbientUserMode总是返回TRUE?

答:如果你在控件类的构造函数,析构函数,OnSetClientSite方法中使用AmbientUserMode()会总是返回TRUE,因为控件还未设置ambient IDispatch连接点到容器,下面演示在OnSetClientSite()中取得其值:

void CYourCtrl::OnSetClientSite()
{
  if ( m_ambientDispdriver.m_lpDispatch && AmbientUserMode() )
  RecreateControlWindow();//商业代码
}

m_ambientDispDriver变量是用于维护COleControl的ambient的自动化接口,只有它m_lpDispatch有效时才会返回这个属性值。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-989738/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2447319