/*此文是我将网上的一些文章,自已遇到的问题进行整理,有些是翻译,所有只供学习讨论,如有版权还属于原作者——作者:黄森堂*/
#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有效时才会返回这个属性值。 
|