Domanda

Ho riscontrato uno strano problema durante l'utilizzo di Graphics.DrawImage .

Quando si utilizza e.Graphics.DrawImage (Image, Point) in OnPaint per disegnare un 'buffer' bitmap sul controllo, sembra che parti dell'immagine siano omessa. Il buffer è popolato in un metodo di supporto che attinge direttamente sul Bitmap usando un Graphics costruito da esso. Quando il controllo dipinge, la bitmap memorizzata nella cache viene disegnata sul controllo.

Nulla sembra essere omesso sulla stessa bitmap, perché quando ho salvato la bitmap su disco e l'ho esaminata, era tutto lì. (vedi immagini sotto)

Ecco come appare il buffer bitmap:
buffer
(fonte: zachjohnson.net )

Questo è ciò che appare sul controllo:
valore visualizzato
(fonte: zachjohnson.net )

Questo è tutto ciò che sto facendo in 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);
    }
}
È stato utile?

Soluzione

Quando viene chiamato OnPaint, Windows ha un'area non valida in cui consente la pittura e tutto il resto viene troncato. Quando si desidera aggiornare un controllo rettangolare, è necessario chiamare InvalidateRect nell'API di Windows per assicurarsi che l'intero rettangolo faccia parte dell'area non valida. OnPaint verrà chiamato automaticamente ogni volta che c'è una parte del controllo non valida.

Altri suggerimenti

Potresti provare un paio di cose diverse.

  • pubblica il codice su " UpdateBuffer "
  • esegui un bitmap.save (ad esempio buffer.save) dopo la chiamata di updatebuffer e controlla l'aspetto della bitmap.
  • assicurarsi che tutti i controlli siano stati disegnati per primi e che nessun controllo sia stato disegnato in modo trasparente, ecc.
  • prendi il codice di " onpaint " e "aggiorna buffer" e inseriscilo in un test di progetto separato per vedere se funziona.
  • elimina " base.onpaint " e controlla cosa succede
  • prova una chiamata a bitmap.drawimageunscaled invece di bitmap.drawimage
  • prova a usare il nuovo punto (0,0) invece di point.empty (un colpo loooong ma non lo sai mai ...)

Tonnellate di opzioni per il debug di questo, solo una questione di restringerlo.

Dai un'occhiata al System.Windows.Forms.ControlStyles.ResizeRedraw

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top