{S0}
简介
本文演示网络类型的内容(在这个例子中我捕获XML)捕捉到一个单一的图像文件的方法之一。我原来的问题,我一直在努力克服以某种方式显示在文档的目录结构,当时我不只是要采取的Windows资源管理器的屏幕截图。我偶然发现一个小示例应用程序,这是我作为。NET控制台应用程序,使我递归遍历目录,并列出这些目录中的文件记录,结果捕捉到一个XML文件。一旦我做到这一点,我想看到当您在Internet Explorer的一个XML文件的XML文件视图(扩大和其他倒塌的一些节点)。我遇到的问题是,我认为是比我的显示器长,所以我的屏幕截图必须手动的几件组成。我曾尝试使用DrawBitmap方法来捕获输出,但是这证明问题,往往只剩下我完全空白的文件。
我选择的解决方案,以确定一个嵌入式web浏览器的屏幕坐标,然后采取一系列的快照,这是我到一个文件中加入。该解决方案还满足情况下的Web内容的长度是不是浏览器的大小的确切倍数。为了让事情更有趣一点,我做了一个BackgroundWorker任务的XML的生产,并显示在状态栏中的进度。异步任务完成前被取消。使用代码
如上所述,我的例子生成一个XML文件,然后在嵌入WebBrowser控件显示。如果你想显示其他网站内容,那么你应该使用一个URL WebBrowser.Navigate方法如下:webBrowser1.Navigate(urlToDisplay);
这个例子的主题是节能的形象,所以我会去周围的功能演示应用程序所采取的一小部分。第一步是声明一个int变量的负载举行的坐标。我的WebBrowser是如此的真实画面的X和Y的左上角像素的位置是在一个小组在表格加入各自的X和Y位置计算。注:我加了5至X和30到Y克服形式框架 - 有一个解决这个问题的纲领性的方法吗?
int变量的下一双举行WebBrowser.Document(可大于屏幕尺寸)的大小。然后我们有一些可见的大小变量,最后一个对偏移。{C}
我然后实例化一个GDI位图的完整图像的大小,然后从位图图形的绘图表面。这些将被用来建立完整的image.nbsp; Bitmap fullImage = new Bitmap(browserFullWidth, browserFullHeight);
Graphics fullImageGraphics = Graphics.FromImage(fullImage);
WebBrowser的滚动,使图像的顶部的看法是,然后我创建一些变量来保存图像的计算出的大小(情况下,它不填写的WebBrowser)。然后,我实例化另一个GDI位图图像分割的大小,然后一个新的位图图形的绘图表面。我用的方法Graphics.CopyFromScreen,来获取图像的显示段,然后Graphics.DrawImage方法将它添加到全尺寸的图像。之后,我的WebBrowser滚动窗口的大小。
我在一个循环中重复此过程,直到我已经收集所有的图像。webBrowser1.Document.Body.ScrollTop = 0;
do
{
int actualImageSegmentHeight = Math.Min(browserWindowHeight,
browserFullHeight - browserOffsetY);
int actualBrowserWindowOffsetY = Math.Min(browserOffsetY,
browserWindowHeight - actualImageSegmentHeight);
Bitmap sectionOfImage =
new Bitmap(browserWindowWidth, actualImageSegmentHeight);
Graphics sectionOfImageGraphics = Graphics.FromImage(sectionOfImage);
sectionOfImageGraphics.CopyFromScreen(realBrowserPositionX,
realBrowserPositionY + actualBrowserWindowOffsetY,
0, 0, new Size(browserWindowWidth, actualImageSegmentHeight),
CopyPixelOperation.SourceCopy);
fullImageGraphics.DrawImage(sectionOfImage, browserOffsetX, browserOffsetY,
browserWindowWidth, actualImageSegmentHeight);
browserOffsetY += browserWindowHeight;
webBrowser1.Document.Body.ScrollTop += browserWindowHeight;
}
while (browserOffsetY < browserFullHeight);
我希望例子是容易follow.nbsp的,我曾考虑把它分割成多个单独的文件,但认为这种单一模块不能过大。使用演示应用
点击顶部的ComboBox选择quot;浏览.. quot;,然后浏览,在它的一些子目录的目录。然后点击"开始"按钮。生成的XML文件显示在WebBrowser窗口,您可以交互通常的方式(点击quot; quot;关闭一个XmlElement和quot; quot;打开)。点击图像按钮保存保存在文件中的WebBrowser。兴趣点
虽然这个应用程序的修修补补,我决定使用BackgroundWorker,我的任务在后台运行,有一展身手。启动和过早停止的任务是很容易在下面的例子所示: - ; // Start the BackgroundWorker task
this.backgroundWorker1.RunWorkerAsync();
// Stop the BackgroundWorker task
this.backgroundWorker1.CancelAsync();
为了使您的应用程序能够停止需求,你需要检查,如果BackgroundWorker的任务,应尽快停止,因为它已经开始,这应该是整个象下面的任务(定期在每个您耗时的功能):// Start the BackgroundWorker task
if (worker.CancellationPending)
{
// Set e.Cancel and then drop out without doing any further work
e.Cancel = true;
}
else
{
// Do some background work...
}
报告进度的BackgroundWorker任务是实现通过调用一些合适的点worker.ReportProgress(INT进展)。历史2006年11月,22日:战后初期