我有一个Winforms应用程序(在Visual Studio 2010中),其中包含一个报表查看器控件,可以预览和打印A4大小的报表。
一个用户将其Windows字体大小设置为150%(即系统DPI更改),并且当他运行报表时,它会在报表查看器预览和打印报表中缩小到2/3大小。
包含报表查看器的表单的AutoScaleMode属性设置为“字体”,但如果我更改它,它似乎不会影响报表。
这不是字体(缺失/缩放)问题,因为我有一个示例程序来演示除了占据整个页面的矩形之外什么都没有的问题。
似乎我需要一些方法在报告本身中指定它应该以96dpi呈现,无论系统dpi设置如何,但无法看到我可以指定的任何地方。我错过了什么?
谢谢, 大卫
答案 0 :(得分:5)
我遇到了同样的问题。 WinForms ReportViewer已经具备DPI功能,并将自行扩展。您只需要告诉系统您的应用程序是DPI识别的,以便系统不会尝试在之后进行扩展。
如果您尚未添加清单,请在标记内添加以下内容:
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
您也可以使用API函数SetProcessDPIAware,但建议不要: http://msdn.microsoft.com/en-us/library/ms633543.aspx
答案 1 :(得分:0)
作为@JoMan所说的补充答案(因为我无法评论他的帖子),请记住,您可以相对简单地手动扩展应用程序中的UI元素。因此,请按照JOMan的建议使应用程序DPI保持感知状态(以使您的系统不会扭曲打印结果)。您可以使用像这样的东西...
Using g As System.Drawing.Graphics = WindowsForm.CreateGraphics
Dim sngScaleFactor As Single = 1
Dim sngFontFactor As Single = 1
If (graphics.Dpix >= 96) Then
sngScaleFactor = (graphics.Dpix / 96) - 0.25
sngFontFactor = (graphics.Dpix / 96) - 0.25
End If
If WindowsForm.AutoScaleDimensions = WindowsForm.CurrentAutoScaleDimensions Then
WindowsForm.Scale(sngScaleFactor)
For Each child As Control In WindowsForm.Controls
ScaleFontRecursively(child, sngFontFactor)
Next
End If
End Using
我敢肯定,很多人会说(正确!),您通常不想检测DPI并手动缩放自己,但是截至2018年,dpi自动缩放使打印的Microsoft报告搞砸的bug仍然很突出,因此这样可以轻松解决。