2009-06-24 4 views
1

Excuse la décharge de code, ce sont des fonctions au sein d'un UserControlUserControl .NET: la propriété Taille donne une valeur incorrecte sur Redimensionner événement

private void PNGQuantPreviewControl_Resize(object sender, EventArgs e) 
{ 
    createOffScreenBm(); 
    draw();   
} 
private void createOffScreenBm() 
{ 
    offScreenBm = new Bitmap(this.Size.Width, this.Size.Height); 
    offScreenGfx = Graphics.FromImage(offScreenBm); 
} 
private void draw() 
{ 
    // draw background 
    offScreenGfx.FillRectangle(transTexture, 0, 0, offScreenBm.Width, offScreenBm.Height); 
    // draw image preview 
    offScreenGfx.DrawImage(pngQuantPreview, getTopLeftPosition()); 
    // apply to picture box 
    this.CreateGraphics().DrawImage(offScreenBm, 0, 0); 
} 

Ainsi, lorsque la taille des changements de contrôle, il recrée l'image hors-écran pour refléter la nouvelle taille et redessine l'image.

Cependant, si je redimensionne rapidement le contrôle, le bitmap ne le remplit pas, il y a un espace restant à droite et/ou en bas. Je suis assez nouveau à C#, donc il y a probablement quelque chose de flagrant que je fais mal, ou je lis les valeurs de taille au mauvais moment. Des idées?

Répondre

2

Tout d'abord vous devez remplacer la méthode OnPaint, ou vous abonner à l'événement Paint et y dessiner tout.

Deuxièmement, vous n'avez pas besoin de créer un bitmap hors écran pour la double mise en mémoire tampon, car .net existe déjà dans la classe BufferedGraphics.

Troisièmement, il est préférable de créer UserControl descedant et activer le double buffering interne .net, quelque chose comme ceci:

public UserControl2 
{ 
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 
} 

En utilisant cette approche, vous obtiendrez une double mémoire tampon, et tout ce que vous avez besoin est de dessinez vos graphiques dans la méthode OnPaint. Vous pouvez en savoir plus sur ce control styles dans Msdn.

+0

Merci beaucoup. J'ai utilisé la propriété DoubleBuffer plutôt que SetStyle. De plus, je n'ai pas réalisé au début d'utiliser l'objet graphique fourni dans le cadre de la méthode OnPaint. –

0

Avez-vous quelque chose comme un séparateur sur votre contrôle, ou un MinSize ou MaxSize déclaré?

1

Avez-vous envisagé de remplacer la méthode OnPaint et de placer le code dans cette méthode? Cela entraînerait l'exécution du code de dessin à chaque fois que le contrôle doit être redessiné, quelle qu'en soit la raison.

Un événement de redimensionnement n'attend pas nécessairement que vous ayez fini de redimensionner le conteneur parent. Lorsque l'événement de redimensionnement est déclenché, il doit attendre que le code se termine avant de pouvoir capturer un nouvel événement de redimensionnement. Lorsque la fenêtre/le contrôle est redimensionné rapidement, il ne peut pas tout conserver et la dernière fois a pu capturer l'événement, pas nécessairement l'état final du contrôle ... si cela a du sens.

Questions connexes