Ho sottoclassato un controllo in C# WinForms e sono un testo di disegno personalizzato nel mio gestore OnPaint()
. Il font è impostato su Courier New utilizzando il seguente codice nella mia forma:Perché DrawString mostra comportamenti inaspettati in C# Winforms?
FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);
Nel controllo stesso, la stringa viene memorizzata in realText
, e io uso il seguente codice per disegnare sullo schermo:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}
il risultato per qualche esempio, testo casuale appare come segue: http://img219.imageshack.us/img219/1778/courier.png
Se si ingrandisce, si può vedere, per esempio, che lo spazio tra il primo 'come' è diverso da t spazio tra il secondo "come" (1 pixel contro 2 pixel). Qualcuno ha idea di cosa potrebbe causare questo, o come posso impedire che accada? C'è molta più stranezza nello spaziatura mentre disegno con caratteri diversi, ma presumo che siano tutti risultati dello stesso problema.
Grazie in anticipo per qualsiasi idea tu possa avere.
Meraviglioso, lo ha fatto senza dover ricorrere al codice win32. Grazie – Ko9
L'oggetto GDI viene rilasciato quando viene eseguito il garbage collector? –
No. Gli oggetti Brush e Pen in .NET sono solo wrapper gestiti attorno a risorse non gestite (il pennello o penna GDI). Quando viene eseguito il programma di raccolta dei rifiuti, elimina il wrapper .NET, ma non l'oggetto GDI sottostante. La regola generale per gli oggetti GDI è quella di avvolgerli in un blocco di utilizzo o di eliminarli esplicitamente nel finalizzatore. Dovresti essere in grado di verificarlo utilizzando Task Manager (attiva la colonna Oggetti GDI) e osserva il conteggio aumentare man mano che perdi le risorse. Il conteggio non diminuirà anche se esegui il kick del GC in azione. –