Question

J'ai rencontré un problème étrange lors de l'utilisation de Graphics.DrawImage .

Lorsque vous utilisez e.Graphics.DrawImage (Image, Point) dans OnPaint pour peindre un bitmap 'tampon' sur le contrôle, il apparaît que des parties de l'image sont omis. Le tampon est rempli dans une méthode d'assistance qui tire directement sur Bitmap à l'aide d'un Graphics construit à partir de celle-ci. Lorsque le contrôle peint, le bitmap mis en cache est dessiné sur le contrôle.

Rien ne semble être omis sur le bitmap lui-même, car lorsque j'ai enregistré le bitmap sur disque et que je l'ai examiné, tout était là. (voir images ci-dessous)

Voici à quoi ressemble le tampon bitmap:
tampon
(source: zachjohnson.net )

Ce qui apparaît sur le contrôle:
valeur affichée
(source: zachjohnson.net )

C’est tout ce que je fais dans OnPaint :

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    if (this.bufferInvalid)
    {
        this.UpdateBuffer();
    }

    if (this.buffer != null)
    {
        e.Graphics.DrawImage(this.buffer, Point.Empty);
    }
}
Était-ce utile?

La solution

Lorsque OnPaint est appelé, Windows a une région non valide dans laquelle il est autorisé à peindre et tout le reste est tronqué. Lorsque vous souhaitez qu'un contrôle rectangulaire soit mis à jour, vous devez appeler InvalidateRect dans l'API Windows pour vous assurer que le rectangle entier fait partie de la région non valide. OnPaint sera appelé automatiquement chaque fois qu’une partie du contrôle est invalide.

Autres conseils

Vous pouvez essayer différentes choses.

  • envoyez le code dans "UpdateBuffer"
  • faites un bitmap.save (c'est-à-dire buffer.save) après l'appel de updatebuffer et vérifiez l'aspect du bitmap.
  • assurez-vous que tous les contrôles ont été dessinés en premier et qu’aucun contrôle n’est dessiné de manière transparente, etc.
  • prenez le code de " onpaint " et " mettre à jour le tampon " et le mettre dans un test de projet distinct pour voir si cela fonctionne.
  • sortir " base.onpaint " et vérifiez ce qui se passe
  • essayez d'appeler bitmap.drawimageunscaled au lieu de bitmap.drawimage
  • essayez d’utiliser un nouveau point (0,0) au lieu de point.empty (un coup très long mais vous ne savez jamais ...)

Des tonnes d’options pour résoudre ce problème, il suffit de le réduire.

Découvrez le System.Windows.Forms.ControlStyles.ResizeRedraw

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top