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

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-989738/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值