Graphics.DrawImage non dipinge sempre l'intera bitmap?
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:
(fonte: zachjohnson.net )
Questo è ciò che appare sul controllo:
(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);
}
}
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