这更简单,而且可能很老套——我可以在这个线程上看到很多 GDI 肌肉,并且显然只适合某些场景。 YMMV
在我的场景中,我使用我称之为“父级”用户控件 - 在 Load 事件期间,我只需从父级的 .Controls 集合中删除要操作的控件,然后父母的OnPaint 负责以任何特殊方式完全绘制子控件。完全使子控件的绘制功能脱机。
现在,我将我的孩子绘制例程交给基于此concept from Mike Gold for printing windows forms 的扩展方法。
这里我需要一个标签子集来呈现垂直到布局:
然后,我在 ParentUserControl.Load 事件处理程序中使用此代码来免除子控件的绘制:
Private Sub ParentUserControl_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SetStyle(ControlStyles.UserPaint, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
'exempt this control from standard painting:
Me.Controls.Remove(Me.HostedControlToBeRotated)
End Sub
然后,在同一个 ParentUserControl 中,我们从头开始绘制要操作的控件:
Protected Overrides Sub OnPaint(e As PaintEventArgs)
'here, we will custom paint the HostedControlToBeRotated instance...
'twist rendering mode 90 counter clockwise, and shift rendering over to right-most end
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
e.Graphics.TranslateTransform(Me.Width - Me.HostedControlToBeRotated.Height, Me.Height)
e.Graphics.RotateTransform(-90)
MyCompany.Forms.CustomGDI.DrawControlAndChildren(Me.HostedControlToBeRotated, e.Graphics)
e.Graphics.ResetTransform()
e.Graphics.Dispose()
GC.Collect()
End Sub
一旦您在某处托管 ParentUserControl,例如一个 Windows 窗体 - 我发现我的 Visual Studio 2015 在设计时和运行时正确呈现 窗体:
现在,由于我的特定操作将子控件旋转了 90 度,我确信该区域中的所有热点和交互性都已被破坏 - 但是,我要解决的问题都是需要预览的包装标签和打印,这对我来说效果很好。
如果有办法将热点和控制性重新引入我故意孤立的控制中 - 我很想有朝一日了解这一点(当然,不是为了这种情况,但......只是为了学习)。当然,WPF 支持这种疯狂的 OOTB.. 但是.. 嘿.. WinForms 仍然很有趣,对吧?