我有一个嵌入webbrowser控件的小应用程序。在那个应用程序中,我创建了一个弹出类。此弹出窗口用于显示服务器生成的错误消息。
我希望能够调整弹出窗口以适应消息。这样一条短消息不会包含在超大尺寸表单中,而大邮件则不会包含在尺寸过小的表单中。
我不想发送宽度和高度,而是想要动态计算尺寸。我也不想明显地重新调整表格,这简直太丑了。
我尝试的一切都失败了:(
这是我认为应该工作的
create the form
move it offscreen by setting its left position to -1000
show the form (offscreen)
write the contents to the webrowser ctl
get the width and height after it renders
hide the form
resize the form to fit the above width and height
center it onscreen
show the form
除非webbrowser控件拒绝呈现,否则应该工作得很好,因此我无法获得客户端的宽度和高度
有谁知道如何做到这一点?
DC
答案 0 :(得分:1)
我已经解决了我遇到的问题。这是一个时间安排。
问题是我正在向webbrowser控件写内容。然后尝试读取宽度和高度。但控件没有渲染,所以我没有得到这些参数。
我在这篇文章的早期就意识到了这一点,所以我把调整大小的代码放在了ondocumentcomplete事件中。遗憾的是,当你直接写文档时,我没有意识到这个事件没有被调用。不知何故,我设法说服自己没有被调用,因为控件被隐藏了。事实并非如此。
所以,一旦我设法解决这个问题,我在调用write函数之后和调用show函数之前就把消息泵输入了。消息泵循环,直到控件返回完成(检查readystate标志)
PopUp->Write(text.c_str());
while (!PopUp->Complete() && ProcessMessages()){ ; }
popup_ctlDownloadComplete(0);
现在手动调用DownloadComplete事件时,文档已渲染,我可以获得宽度和高度。
如果出现错误,上面的代码可能会导致无限循环,所以我添加了一个计数器来杀死它。只是为了简洁和清晰而没有显示。
哦,代码是遗留代码而不是托管代码
DC