J'ai un panneau dans lequel je fais un dessin personnalisé. Pour vous assurer que l'échelle graphique est proportionnelle lorsque le panneau est redimensionné, j'utilise la propriété Transform
de mon Graphics
.Mise à l'échelle brutale des graphiques lors du redimensionnement du panneau
private void panelGraph_Paint(object sender, PaintEventArgs e)
{
var gfx = e.Graphics;
gfx.Transform = BuildTransform(e.ClipRectangle);
var width = 1.0f/gfx.Transform.Elements[0];
var white = new Pen(Color.White, width);
gfx.DrawLine(white, new PointF(-1.0f, -1.0f), new PointF(1.0f, -1.0f));
gfx.DrawLine(white, new PointF(-1.0f, -1.0f), new PointF(-1.0f, 1.0f));
}
La matrice de BuildTransform
mappe une zone avec une largeur et une hauteur [-2, 2] vers la zone de e.ClipRectangle
.
Le code fonctionne, en quelque sorte. Le problème est que lorsque je redimensionne le panneau, la mise à l'échelle de mes graphiques n'est pas fluide mais s'effectue par étapes discrètes. Si j'ajoute la ligne suivante dans ma peinture fonction:
Console.WriteLine("Paint {0} {1}", e.ClipRectangle.Width, e.ClipRectangle.Height);
Je reçois la sortie comme ça quand je redimensionne lentement la fenêtre:
Paint 1 815
Paint 1 815
Paint 1 815
Paint 751 815
Paint 1 815
Paint 753 815
Paint 1 813
Paint 754 811
Qu'est-ce qui provoque cela et comment puis-je résoudre ce problème?
EDIT: Le problème n'est pas déterministe mais semble dépendre de la rapidité avec laquelle je redimensionne la fenêtre (!). Si je redimensionne lentement et lentement la fenêtre, je peux l'obtenir presque arbitrairement sans que la taille de mes graphiques ne change.
Aha, je pense que je comprends ma sortie maintenant.Le rectangle du clip est la zone qui a besoin d'être repeinte, alors quand je viens d'ajuster la taille verticale de la fenêtre d'un pixel, j'obtiens une taille de clip de quelque chose comme '654, 1'. Dès que je le redimensionne horizontalement, toute la région devra être redessinée. –
Ouais! WinForms essaie d'optimiser la repeindre pour vous. Windows récupère normalement les zones et utilise le plus petit rectangle les contenant toutes pour le processus d'invalidation. Assez souvent, vous devez remplacer ce comportement si vous voulez avoir des graphismes fluides, c'est-à-dire dans l'interaction de l'utilisateur. Vous pouvez également jeter un oeil à ce lien: http://stackoverflow.com/questions/957573/winforms-how-to-speed-up-invalidate – Pedery