SelectObject - Object wieder DEselectieren
-
Hallo Leute,
ich werfe mit folgenden Code nen neuen Font in ein DC:
HGDIOBJ DDBS_Obj = SelectObject(DDBS_DC,CreateFont(38,0,0,0,0,0,0,0,0,0,0,0,FIXED_PITCH,"Comic Sans MS"));Schön und Gut, mein Font ist da, aber das wird 25 mal pro Sekunde gemacht,
in einem Spiel mit DirectDraw (DDraw), das DC ist von einem BackSurface.Wie kann ich dieses Objekt jetzt wieder freigeben??
DeleteObject() kann ich nicht nehmen, da sonst mein Surface zerstört wird,
ich muß also "Deselectieren", nur wie?guß Micha
-
So ungefähr...
HFONT hFont = CreateFont(38,0,0,0,0,0,0,0,0,0,0,0,FIXED_PITCH,"Comic Sans MS"); HGDIOBJ hOriginalFont = SelectObject(DDBS_DC, hFont); // Zeichnen. SelectObject(DDBS_DC, hOriginalFont); DeleteObject(hFont);Ich würde den Font einmal am Anfang des Programms erstellen und am Ende löschen. Aber irgendwann brauchst du DeleteObject.
-
Ja genau so, Danke.
Ich Hirnie hatte das auch so Vorgesehen und habe
am Anfang ein paar Font Objecte erstellt, aber im
ganzen drum herum und gedanken woanders und nur mal
die Textaugabe meine Klasse testen etc. ist mir das
entfallen. Daher habe ich da den ganz schnellen Weg
gewählt, na ja jetzt habe ich es so wie es geplant
war und es geht.Tip: Immer bei der Planung und/oder Pflichtenheft bleiben
dann klappt es auch
//Fonts setzten für Spiel HFONT TitleScrollerFont = CreateFont(32,0,0,0,0,0,0,0,0,0,0,0,FIXED_PITCH,"Comic Sans MS"); if (TitleScrollerFont = NULL) TitleScrollerFont = CreateFont(38,0,0,0,0,0,0,0,0,0,0,0,FIXED_PITCH,"Arial"); HFONT ScoreFont = CreateFont(24,0,0,0,0,0,0,0,0,0,0,0,FIXED_PITCH,"Verdana"); if (TitleScrollerFont = NULL) ScoreFont = CreateFont(22,0,0,0,0,0,0,0,0,0,0,0,FIXED_PITCH,"Arial"); //...etc... //Aufräumen DeleteObject(TitleScrollerFont); DeleteObject(ScoreFont); //....etc.....Code der Routine in der Klasse
void Game::TextBlt(int X, int Y,HFONT FontType, COLORREF txtColor, char *Text) { HDC DDBS_DC; if (DDBackSurface->GetDC(&DDBS_DC) == DD_OK) { HGDIOBJ OldObject = SelectObject(DDBS_DC,FontType); SetBkMode(DDBS_DC,TRANSPARENT); SetTextColor(DDBS_DC,txtColor); TextOut(DDBS_DC, X, Y, Text, strlen(Text)); DDBackSurface->ReleaseDC(DDBS_DC); SelectObject(DDBS_DC, OldObject); DeleteObject(FontType); } }Habe mal stück Code zugesetzt, falls ich wieder mal vergesse

-
Erstellst du den Font vor jedem TextBlt neu?

Oder warum hast du das DeleteObject in TextBlt?
-
Upps, ne natürlich nicht.
Ich hatte das aus einem vorheringem Test drinn gelassen. :p
Hier nochmal ohne, denn sonst gehts ja nicht und der Standard Font kommt

void Game::TextBlt(int X, int Y,HFONT FontType, COLORREF txtColor, char *Text) { HDC DDBS_DC; if (DDBackSurface->GetDC(&DDBS_DC) == DD_OK) { HGDIOBJ OldObject = SelectObject(DDBS_DC,FontType); SetBkMode(DDBS_DC,TRANSPARENT); SetTextColor(DDBS_DC,txtColor); TextOut(DDBS_DC, X, Y, Text, strlen(Text)); DDBackSurface->ReleaseDC(DDBS_DC); SelectObject(DDBS_DC, OldObject); } }