SelectObject! Wozu?
-
Hallo,
kann mir mal jemand erklären wozu ich SelectObject brauche?
Hab in der MSDN gelesen, da heisst es das ich dem 2. Parameter von SelectObject den Typ des ersten Paramters zuweise(??????)
Ich versteh das nicht.
Ein Beispiel:
In einer Methode in der alle Ressourcen freigegeben werden müssen steht folgendes:
if(old_bmp) { SelectObject(back_hdc,old_bmp); // Select back original HBITMAP old_bmp = NULL; }wobei back_hdc vom Typ HDC ist und old_bmp vom Typ HBITMAP ist.
Was bringt das bitte? Wann und warum ich SelectObject brauche?
Wäre dankbar für Antworten...

Gruß
-
The SelectObject function selects an object into the specified device context (DC).
Dieses Object kann z.B. ein Brush, Font, Pen, o.ä. sein - warum brauchst du das? Ganz einfach, weil in einem DC immer nur ein Object jeder Sorte aktiv sein kann. Willst du jetzt z.B. mit einer anderen Pen-Farbe zeichnen, dann selektierst du einfach den entsprechenden Pen in den DC.
Zu dem Code-Beispiel, das du gepostet hast: Du kannst / solltest keine GDI-Objekte löschen, die noch in einen DC selektiert sind - also selektierst du einfach wieder das zuvor aktive Objekt wieder zurück und kannst dann das andere wieder freigeben.
-
Wenn du in Windows irgendeine Graphikausgabe machen willst dann brauschat du dazu erst mal ein Device Handle.
Wenn du nichts anderes machst sind da einmal gewisse Standard Objecte ( Werkzeuge ) selektiert. Wenn du jetzt aber andere Werkzeuge ( Brush, Bitmap, Font, Region ... ) verwenden willst dann geht man normalerweise folgendermassen vor.
z.b
1. Brush erzeugen
2. Brush in den DC selektieren
3. Brush verwenden
4. Originale Brush selektieren
5. Brush freigeben
Aus diesem Grund gibt dir SelectObject das Object vom gleichen Typ zurück das vorher selektiert war.
Du solltest es also folgendermassen VerwendenHBRUSH oldBrush = (HBRUSH)SelectObject( dc, newBrush ); // cast ist notwendig da SelectObject verschiedenartige Handles zurückgibt .... // newBrush werwenden SelectObject( dc, oldBrush ); // Vorherige Brush zurückselektieren DeleteObject( newBrush ); // Brush freigebenWenn du das nicht so machst und ein selektiertes Objekt freigibst bringst du damit Windows total durcheinander das kann bis zum Totalabsturz von Windows führen.
Kurt
-
Das fehlende Zurückselektieren fällt leider bei Windows XP (glaub auch 2000) nicht auf.