C'est encore plus simple, et peut-être hacky - car je peux voir beaucoup de muscle GDI sur ce fil , et ce n'est évidemment qu'un bon choix pour certains scénarios.YMMV
Dans mon scénario, j'utilise ce que j'appellerai un UserControl "Parent" - et pendant l' Load
événement, je supprime simplement le contrôle à manipuler de la .Controls
collection Parent et le Parent'sOnPaint
s'occupe de peindre complètement l'enfant contrôler de quelque manière que ce soit ... en mettant pleinement hors ligne les capacités de peinture de l'enfant.
Maintenant, je confie la routine de peinture de mon enfant à une méthode d'extension basée sur ce concept de Mike Gold pour l'impression de formulaires Windows .
Ici, j'ai besoin d'un sous-ensemble d'étiquettes pour rendre perpendiculaire à la mise en page:
Ensuite, j'exempte le contrôle enfant d'être peint, avec ce code dans le ParentUserControl.Load
gestionnaire d'événements:
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
Ensuite, dans le même ParentUserControl, nous peignons le contrôle à manipuler à partir de zéro:
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
Une fois que vous hébergez le ParentUserControl quelque part, par exemple un formulaire Windows - je constate que mon Visual Studio 2015 rend le formulaire correctement au moment du design ainsi qu'au moment de l'exécution:
Maintenant, comme ma manipulation particulière fait pivoter le contrôle enfant de 90 degrés, je suis sûr que tous les points chauds et l'interactivité ont été détruits dans cette région - mais le problème que je résolvais concernait uniquement une étiquette d'emballage qui devait être prévisualisée et imprimée, qui a bien fonctionné pour moi.
S'il y a des moyens de réintroduire les points chauds et le contrôle dans mon contrôle volontairement orphelin - j'aimerais en savoir plus un jour (pas pour ce scénario, bien sûr, mais ... juste pour apprendre). Bien sûr, WPF prend en charge une telle folie OOTB .. mais .. hé .. WinForms est encore tellement amusant, non?