Podklasowałem kontrolkę w WinForm C# i mam niestandardowy tekst do rysowania w mojej procedurze obsługi OnPaint()
. Czcionka jest ustawiony na Courier New stosując następujący kod w moim formularzu:Dlaczego DrawString wykazuje nieoczekiwane zachowanie w WinFormach C#?
FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);
w samej kontroli, ciąg jest przechowywany w realText
i używam poniższy kod, żeby wyciągnąć go na ekranie:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}
wynik jakiegoś losowego przykład tekst wygląda następująco: http://img219.imageshack.us/img219/1778/courier.png
Jeśli powiększać, można zobaczyć na przykład, że przestrzeń pomiędzy pierwszym „jako” jest inny niż t ma przestrzeń między drugim "as" (1 piksel w stosunku do 2 pikseli). Czy ktokolwiek ma pojęcie, co może być przyczyną tego lub jak mogę temu zapobiec? Jest o wiele więcej podobnych dziwactw w odstępach, jak rysuję różnymi czcionkami, ale zakładam, że wszystkie są wynikiem tego samego problemu.
Z góry dziękuję za wszelkie pomysły.
Cudownie, zrobił to bez konieczności uciekania się do kodu win32. Dzięki – Ko9
Czy obiekt GDI zostanie zwolniony po uruchomieniu Kosza ze śmieciami? –
Nie. Obiekty pędzla i pióra w programie .NET to po prostu zarządzane opakowania wokół niezarządzanych zasobów (pędzla lub pióra GDI). Kiedy uruchamia się garbage collector, pozbywa się wrappera .NET, ale nie bazowego obiektu GDI. Ogólna zasada dla obiektów GDI polega na zawijaniu ich w blokach lub jawnym ich usuwaniu w finalizatorze. Powinieneś być w stanie to zweryfikować za pomocą Menedżera zadań (włączyć kolumnę Obiekty GDI) i obserwować wzrost liczby podczas wycieku zasobów. Liczba nie spadnie, nawet jeśli włączysz GC do działania. –