{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日:战后初期

回答

评论会员:讯莹 时间:2011/12/07
我的网页,只要在窗口观看,并有垂直滚动蝙蝠
我预期的形象,包括所有的页面,但它包括可见部分

评论会员:NutSoft 时间:2011/12/07
您好,

我已经做了一些测试和有时已经注意到几件事情发生,我从来没有见过;

a)当图像是很长的过大保存为一个图像,并导致异常。
b)当应用程序的大小非常小,产生的图像包括滚动条。

我抱歉地说,我没有任何快速修复这些问题,我无法投入任何时间,目前他们,但如果我在未来的时间我会更新这个条目。

非常感谢您的意见。

的问候,DES F
评论会员:mjesterak 时间:2011/12/07
文章很有趣,但下载链接坏了... ...
评论会员:NutSoft 时间:2011/12/07
下载链接,由于某种原因附加演示文件名 - 固定。
评论会员:mjesterak 时间:2011/12/07
是的,得到了​​现在。
应用程序的伟大工程!
只需一个文件夹选择对话框注意:如果你在ComboBox控件中手动键入一个文件夹路径,抛出一个异常,当应用程序试图建立的文件夹结构。显然,在下拉列表中的第一个选择是选择(浏览),而不是把你的输入文字。你可能想控制其他莫名其妙锁定用户输入验证/接受路径的手动输入。

把戏我已经使用过一个组合框的顶部放置一个文本框,其大小,以适应恰到好处地下拉箭头左侧。然后,您可以使文本框只读和处理ComboBox中选择改变事件来填充文本框。它是一个可视化的黑客,但它的作品。另外,我已经使用代码项目上找到MTGCCombobox.dll控制的组合框... ...它与标准组合框的方法更好的性能/,有一个很好的自动完成功能,等不知道这是否会工作。 NET 2.0中。
评论会员:NutSoft 时间:2011/12/07
感谢您的反馈 - 说实话,我忽略了 - 我用了从MSDN BetterComboBox,但取代标准的ComboBox用于上载这里,和我从来没有打扰到它打字{BR。 }
至少我现在有别的东西看看 - 我是奋力想什么就做什么

非常感谢!

关于作者

NutSoft
中国
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
或代码 网站备案号:粤ICP备15020848号-1