佚名通过本文主要向大家介绍了atl控件,atl34砂轮,atl方形动力电池,atl80.dll官方下载,atl71.dll一键修复等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 求ATL复合控件,让它可以隐藏,又能让他有窗口
描述:
详细的问题是这样的:
我用Vs2008 ATL开发了一个窗口型的复合控件的ActiveX,放在IE网页上,网页上有两个同样的ActiveX控件,用Tab网页控件切换控件显示和隐藏,Tab网页控件是使用jquery的tab控件,现在的问题是一旦切换,就会把隐藏掉的控件自动Destroy掉了,后来发现是m_bWindowOnly设置为TRUE的原因,但是如果不为TRUE,则得不到窗口句柄m_hWnd,而现又必须先得到它,又能让控件可以隐藏,怎么办好呢?
解决方案1:
如果你重载了某些函数,比如OnPreVerbHide/UIDeactivate/OnPostVerbHide,你要检查这些函数里面是不是销毁窗口了,本身是不应该销毁的。 解决方案2:
描述:
本帖最后由 okcwf 于 2009-11-02 00:48:16 编辑
在ATL开发的Active复合控件时,如何用代码去激活它,让它有窗口句柄m_hWnd。我把m_bWindowOnly设置为FALSE了,因为如果一旦把m_bWindowOnly设置为TRUE,一隐藏控件就会自动Destroy掉?详细的问题是这样的:
我用Vs2008 ATL开发了一个窗口型的复合控件的ActiveX,放在IE网页上,网页上有两个同样的ActiveX控件,用Tab网页控件切换控件显示和隐藏,Tab网页控件是使用jquery的tab控件,现在的问题是一旦切换,就会把隐藏掉的控件自动Destroy掉了,后来发现是m_bWindowOnly设置为TRUE的原因,但是如果不为TRUE,则得不到窗口句柄m_hWnd,而现又必须先得到它,又能让控件可以隐藏,怎么办好呢?
解决方案1:
是你自己的代码有问题吧,最好跟踪一下源码,控件隐藏只会隐藏窗口,不会销毁窗口。
看看ATL中IOleObjectImpl的源码:
HRESULT DoVerbHide(LPCRECT /* prcPosRect */, HWND /* hwndParent */)
{
T* pT = static_cast<T*>(this);
HRESULT hr;
hr = pT->OnPreVerbHide();
if (SUCCEEDED(hr))
{
pT->UIDeactivate();
if (pT->m_hWnd) // 如果控件有窗口
pT->ShowWindow(SW_HIDE); // 隐藏窗口
hr = pT->OnPostVerbHide();
}
return hr;
}
如果你重载了某些函数,比如OnPreVerbHide/UIDeactivate/OnPostVerbHide,你要检查这些函数里面是不是销毁窗口了,本身是不应该销毁的。 解决方案2:
你可以自己设置一个变量,来控制他的显示和隐藏.
在ATL里隐藏,不要在外部隐藏.
比如添加一个方法
SetXXXX(BOOL bShow)
{
---
}