版主及各位高手,来看看这段ActiveX自调整大小的代码,是否是IE的BUG??

nbb01 2003-03-09 12:17:42
WinXP简体中文家庭版(IE6),VS.NET(ATL7)

ActiveX控件自调整自己的大小,2次之后,IE的滚动条消失,实际控件的大小
调整正确, 但IE没有调整自己的窗口尺寸,是否是IE的BUG??不得以,强制
状态条开/关一次解决问题:)

void SetNewSize(int cx, int cy)
{
SIZEL szlPixels, szlMetric;
szlPixels.cx = cx;
szlPixels.cy = cy;

AtlPixelToHiMetric(&szlPixels, &szlMetric);
// IOleObjectImpl
SetExtent(DVASPECT_CONTENT, &szlMetric);

// update control sizing...
m_rcPos.left = 0;
m_rcPos.top = 0;
m_rcPos.right = m_rcPos.left + cx;
m_rcPos.bottom = m_rcPos.top + cy;
if (m_spInPlaceSite != NULL)
{
// needed for IE to accept the resizing
m_spInPlaceSite->OnPosRectChange(&m_rcPos);

/*
// 不得以的方法,强制状态条开/关一次,刷新IE状态条。
if (m_pBrowser != NULL)
{
VARIANT_BOOL bStatus;
m_pBrowser->get_StatusBar(&bStatus);
m_pBrowser->put_StatusBar(!bStatus);
m_pBrowser->put_StatusBar(bStatus);
}
*/

}
SetFocus();
}
...全文
31 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nbb01 2003-03-16
arxing(阿行)果然是高手,谢谢,更要感谢的是你的热心。那个RequestNewObjectLayout()
是在哪里查到的?我一点都不知道还有这个函数,还望能够告知一二。很希望能够结识你,
我的QQ号:83164485

我不想暴露给外部一个ReSize方法,把RequestNewObjectLayout()加入到那个SetNewSize()
中,结果打开网页,IE停止响应,硬盘狂转不止,最后系统告诉我虚拟内存不足,IE死掉了。

RequestNewObjectLayout()执行,其中的过程是不是相当于按IE的“刷新”按钮?我那个
ActiveX的工作过程是这样的:打开网页,控件从IE取得URL,连接到服务器,下载矢量图形
文件,打开文件,按其中的参数设置控件的大小,绘制矢量图,开线程定时提取实时数据。

我怀疑RequestNewObjectLayout()中执行了ReLoad,造成递归了。项目时间要求紧,我暂时
用前面的方法(那一点变化,看不出对界面有什么影响,呵呵),等以后再仔细研究,我先结
贴了,非常感谢。
回复
Delphist 2003-03-15
store
回复
arxing 2003-03-14
试试这方法:
STDMETHOD(ReSize)(long cx, long cy)
{
SIZEL sizeh;
SIZEL sizep = { cx, cy };
AtlPixelToHiMetric(&sizep, &sizeh);
SetExtent(DVASPECT_CONTENT, & sizeh);
return m_spClientSite->RequestNewObjectLayout();
}
回复
nbb01 2003-03-10
To arxing(阿行):
是WindowOnly模式,我专门做成这种模式的,ActiveX自己的大小调整正确,可IE就是刷新不对;奇怪的是开始两次还正确,后面IE的滚动条就消失了,真没办法。
回复
arxing 2003-03-10
检查一下你的控件是不是有自己的窗口句柄。没有的话,你应该把控件的m_bWindowOnly置TRUE。
回复
winphoenix 2003-03-09
up
回复
发帖
ATL
创建于2007-09-28

3214

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
帖子事件
创建了帖子
2003-03-09 12:17
社区公告
暂无公告