窗体打印控件






3.71/5 (7投票s)
一个扩展控件,让打印窗体变得快速、简单且灵活
引言
最常见的问题之一是“如何打印/打印预览我的 Windows 窗体”?这可以通过让窗体“自行绘制”到打印页面上,或者使用 VB Power Packs 来实现,但这通常不令人满意,因为
- 控件在窗体上的位置可能不在打印页面上您想要的位置
- 文本以屏幕分辨率绘制
- 所有控件都会被绘制(例如,按钮、窗体边框等)
附加的组件以不同的方式解决了这个问题……您所要做的就是将一个 FormPrintHelperComponent
组件拖放到您的窗体上,它会为该窗体上的每个控件扩展一组新的属性(请在每个控件的属性窗口中查找名为“MCL Form Print Helper”的部分)。
然后,您将这些属性设置为指示
- 控件是否应被打印
- 是将其打印为文本、图像还是所有者绘制
- 要打印的边界矩形
- 在该区域内的垂直/水平对齐方式
- 要使用的字体和背景/前景色等。
该组件随后允许您在设计时预览打印页面,并在运行时预览或打印它。
工作原理
该组件实现了 System.ComponentModel.IExtenderProvider
,这意味着它向窗体上的其他控件提供属性——就像内置的ToolTip和F1 Help provider组件一样。
该类使用 ProvideProperty
属性进行装饰,这会告诉 IDE 该控件为扩展窗体上控件的属性提供了哪些属性。在这些“属性”的底层,是一对匹配的函数和子例程,用于获取/设置传递给控件的属性,当目标控件属性窗口中修改了扩展属性时,就会调用它们。
当组件被调用进行打印或打印预览时,它会遍历窗体上所有 Print
属性设置为 true
的控件。然后,它会根据该控件提供的其他扩展属性(如边界矩形、字体、前景色和背景色等)来打印控件。
PrintMode
扩展属性会影响控件的打印方式。有三个选项:
PrintAsText
- 打印控件的“Text
”属性PrintAsImage
- 打印控件的“Image
”属性(如果存在);否则,将控件作为位图打印,就像它在屏幕上显示的那样PrintAsOwnerDrawn
- 将控件传递给OwnerDrawnControlprint
事件,以便应用程序可以决定如何打印控件
“以图像方式打印”打印功能
如果控件没有 Image
属性,则会将控件绘制到位图中,然后通过使用控件类的 DrawToBitmap
方法将其打印到窗体上。
Private Function GetControlImage(ByVal ctlIn As Control) As Image
Dim Imageproperty As System.Reflection.PropertyInfo
Imageproperty = ctlIn.GetType.GetProperty("Image", GetType(Image))
If Imageproperty Is Nothing Then
Dim imgNew As New Bitmap(ctlIn.Width, ctlIn.Height)
ctlIn.DrawToBitmap(imgNew, ctlIn.ClientRectangle)
Return imgNew
Else
Return CType(Imageproperty.GetValue(ctlIn, Nothing), Image)
End If
End Function
“所有者绘制”打印功能
如果将扩展属性 PrintMode
设置为PrintAsOwnerDrawn
,那么在运行时,当调用打印或打印预览逻辑时,将引发 OwnerDrawnControlPrint
事件,以允许您以编程方式将控件绘制到页面画布上。
Private Sub FormPrintHelperComponent1_OwnerDrawnControlPrint(ByVal sender As Object, _
ByVal e As MCL_Form_Print_Control.OwnerPrintControlEventArgs) _
Handles FormPrintHelperComponent1.OwnerDrawnControlPrint
'\\ The application code should draw this
'\\ control because it is special....
With e
If .ControlToPrint.Name = "DateTimePicker1" Then
e.Canvas.FillRectangle(Brushes.Aqua, e.BoundingRectangle)
e.Canvas.DrawString(">> " & .ControlToPrint.Text & _
"<<", .ControlToPrint.Font, _
Brushes.Azure, e.BoundingRectangle)
End If
End With
End Sub
工作示例
首先,编译附带的源代码,然后将控件的 DLL 添加到您的应用程序中,并(可选)将其添加到工具箱。
下一步是在设计模式下布局您的 Windows 窗体,包含所有您想要的控件。(您可以稍后添加控件,并且扩展程序会捕获它们,因此不必担心一开始就需要完整的布局)。然后,将组件的一个实例从工具栏拖放到您的窗体上。
然后,选择您想要打印的控件——例如,在源代码顶部演示项目中的窗体上,Label_Databasename
、CheckedListBox_Databases
等控件是要打印的,但用户不想打印按钮 Button1
和 Button2
。
在要打印控件的控件属性窗格中,向下导航到“MCL Form Print Utility”部分,并将名为“Print on FormPrintHelperComponent1”的扩展属性设置为 true
。
将富文本框模式设置为 PrintAsRichText
意味着富文本框的内容将以所见即所得模式打印。.
选择在页面上打印控件的位置
默认情况下,FormPrinthelperComponent1
上的“BoundingRectangle
”属性设置为与控件在窗体上占据的矩形相同。您可以更改此设置(以使布局更适合打印页面的大小和方向),方法是更改此属性中的值。要查看此更改的外观,您可以选择 FormPrintHelperComponent
实例,然后从其智能标签菜单中,选择“Preview Document”选项来预览窗体打印布局。
其他提供的扩展属性
该组件向其所在窗体提供以下扩展属性:
DocumentName
- 文档在打印队列中打印时显示的名称。如果未设置,则默认为窗体的名称。PaperKind
- 用于打印文档的纸张大小(A4、A5、Letter 等)。
该组件向其所在窗体上的所有控件提供以下扩展属性:
BackColour
- 在打印控件之前用于填充控件边界矩形的颜色。如果此颜色是透明的,则边界矩形不会遮挡在其之前打印的项目。BoundingRectangle
- 在页面上打印控件的位置。ForeColour
- 用于打印控件的前景色(如果打印模式不是PrintAsText
,则此设置无效)。HorizontalAlignment
,VerticalAlignment
- 如何将控件的文本相对于其边界矩形进行对齐以进行打印。Print
- 如果要在页面上打印,则为 True,否则为 False。PrintFont
- 如果打印方法是PrintAsText
,则用于打印控件文本的字体。PrintMethod
- 如何打印控件(请参阅上方解释)。TopBorder
,BottomBorder
,LeftBorder
,RightBorder
- 用于在打印文档的边界矩形周围绘制边框的笔。
多页文档
当然,有很多情况需要将一个窗体打印到多个逻辑页面上——例如,如果一个窗体有很多选项卡,您可能会发现按每个选项卡打印一个逻辑页面是合理的。
该组件通过一个名为 LogicalPages
的属性来实现此功能,该属性是一个大于等于 1 的正数,表示该窗体应打印的总逻辑页数。然后,对于每个控件,将添加两个额外的扩展属性来控制该控件应打印在哪几页上:MultiPageprintMethod
,它是一个枚举类型
PrintOnEveryPage
- 在每一逻辑页上打印控件PrintOnOddPages
- 在奇数逻辑页上打印控件PrintOnEvenPages
- 在偶数逻辑页上打印控件PrintOnlyOnSpecifiedLogicalPages
- 仅在指定的逻辑页上打印控件
如果 MultiPageprintMethod
设置为 PrintOnlyOnSpecifiedLogicalPages
,则会使用第二个扩展属性 PrintOnPages
(它是一个布尔值列表,每个逻辑页对应一个值)来设置要打印的页面。
逻辑页?
当控件中的数据(如多行文本框、富文本框或网格)太大而无法容纳在文档中分配给它的区域时,您可以选择将其设置为在新页面上继续显示,直到数据结束,方法是将扩展属性 DataOverflowAction
设置为 CreateNewPage
。
但是,新页面将与当前页面是同一个逻辑页面(上面包含相同的控件),但会是不同的物理页面。在设计阶段使用逻辑页面允许创建一个多部分文档,该文档在运行时无需更改即可容纳额外数据。
更新
- 添加了
UITypeEditor
,允许您设置所有边框线的颜色和线宽 - 添加了扩展属性
Trimming
,用于控制单词在边界矩形内的换行方式 - 添加了扩展属性
PropertyToPrint
,允许您指定要打印控件的哪个属性 - 添加了
PrinterSettings
方法,该方法调用打印机设置对话框,允许在运行时更改设置 - 添加了
PageSetup
方法,该方法调用页面设置对话框,允许用户在运行时更改页面布局 - 添加了多页功能
- 添加了代码,通过设置
RTFPrintMethod
将富文本框作为富文本(所见即所得)打印 - 添加了 C# 版本的组件