在遇到Visual Basic的打印质量问题后,我决定采用不同的方法。我将模拟ALT-PRINTSCREEN键盘按键以捕获当前状态的表单。
然而,在此之前,我需要从表单中删除某些元素(例如边框),并在获取图像后,我需要替换这些元素。我有一些时间/同步问题,因为我注意到某些元素仍然在已复制到剪贴板的图像上。
我认为这是因为需要时间来处理更改,以及Windows处理模拟"发送密钥的时间,因此我设置了睡眠计时器。我的结果好坏参半。我注意到如果我不替换后面的元素,剪贴板图像就会正确显示。但是,如果我更换它们,即使我设置了20秒的睡眠定时器,它们也不会出现。
因此,我知道存在某种同步问题,但我不知道如何解决它。这是我正在使用的代码:
'Make these forms invisble so they are not printed
Logo.Visible = False
MenuStrip1.Visible = False
ReportsButton.Visible = False
pnlmain.BorderStyle = 0 'remove the border
'Sleep
System.Threading.Thread.Sleep(1000)
'simulate an ALT and PRINTSCREEN key click to get ONLY the report
SendKeys.Send("%{PRTSC}")
'Sleep
System.Threading.Thread.Sleep(1000)
'Now, get the image from the clipboard
Dim formImage As System.Drawing.Image
formImage = My.Computer.Clipboard.GetImage()
Logo.Visible = True
MenuStrip1.Visible = True
ReportsButton.Visible = True
pnlmain.BorderStyle = 1
改变睡眠持续时间似乎没有太大变化(除非它们非常低)。
有什么建议吗?
编辑:这是绘制到位图的代码(在修改上面的代码之后):
formImage = New Bitmap(Me.Width, Me.Height, Me.CreateGraphics())
Me.DrawToBitmap(formImage, New Rectangle(0, 0, Me.Width, Me.Height))
发送到打印操作时:
Dim g As Graphics = e.Graphics
'transform the form image so it fits the height and width of the paper, with a 5 px margin
Dim res = printSettings.PrinterResolutions
Dim newSizeDestinationPoints As Point() = {
New Point(5, 5),
New Point(841, 5),
New Point(5, 956)
} 'These values are based on A4 sized paper
'g.DrawImage(formImage, 5, 5)
g.DrawImage(formImage, newSizeDestinationPoints)
低质量并非来自这段时间。