ATL问题集-#22 ~ #23

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

#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有效时才会返回这个属性值。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航