c# - 在屏幕外(或隐藏)渲染网络浏览器控件

标签 c# .net c++ com webbrowser-control

我有一个嵌入了网络浏览器控件的小应用程序。在该应用程序中,我创建了一个弹出类。此弹出窗口用于显示服务器生成的错误消息。

我希望能够调整弹出窗口的大小以适应消息。这样一来,短消息就不会包含在过大的表单中,而大消息也不会包含在过小的表单中。

我不想发送宽度和高度,而是想即时计算尺寸。我也不想明显地调整表单的大小,那简直太丑了。

我尝试的一切都失败了:(

这是我认为应该可行的

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 控件拒绝呈现,因此我无法获取客户端宽度和高度

有谁知道如何做到这一点?

直流

最佳答案

我已经解决了我遇到的问题。这是一个时机。

问题是我正在向网络浏览器控件写入内容。然后尝试读取宽度和高度。但是控件没有呈现,所以我没有得到这些参数。

我在这篇文章的早期就意识到了这一点,所以我将调整大小的代码放在了 ondocumentcomplete 事件中。遗憾的是我没有意识到当您直接写入文档时不会调用此事件。不知何故,我设法说服自己它没有被调用,因为控件是隐藏的。事实并非如此。

所以一旦我弄明白了,我就在调用写入函数之后和调用显示函数之前放置了一个消息泵。消息泵循环直到控制返回完成(检查就绪状态标志)

PopUp->Write(text.c_str());
while (!PopUp->Complete() && ProcessMessages()){ ; }
popup_ctlDownloadComplete(0);

现在,当手动调用 DownloadComplete 事件时,文档已经呈现,我可以获得宽度和高度。

如果出现错误,上面的代码可能会导致无限循环,所以我添加了一个计数器来在发生这种情况时终止它。只是为了简洁明了而未显示。

哦,代码是遗留代码而不是托管代码

直流

关于c# - 在屏幕外(或隐藏)渲染网络浏览器控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2304466/

相关文章:

c# - Visual Studio 。代码更改不做任何事情

c# - 验证接口(interface)属性

c# - .NET C# 从 UNC 运行应用程序导致错误

c# - 如何在现有 PDF 中使用 iTextSharp 插入指向另一个页面的超链接?

c++ - gcc 相当于#pragma comment

c++ - 逐行读取文件时如何跳过字符串

c# - 在Windows服务上设置版本

c# - 以 ? 结尾的变量类型

.net - 是否有插入具有多个级联值的 .NET Blazor 组件的简写?

c++ - 将静态库链接到cmake中的共享库