GDI und SelectObject
-
Hallo.
Mir ist aufgefallen, dass manchmal im Code die Rueckgabe von SelectObject, also das "alte Objekt" gespeichert wird, um es dann nach dem Zeichenvorgang wieder mit SelectObject zurueckzuschreiben:HGDIOBJ old = SelectObject(hdc, bitmap); Rectangle(hdc, 10, 10, 100, 100); SelectObject(hdc, old);
Soweit ich das verstanden habe ist das auch notwendig, weil man den Bitmap sonst nicht freigeben kann (mit DeleteObject) und auch nicht fuer aendere Dinge verwenden kann.
Meine Frage ist, muss ich das auch fuer HPEN und HBRUSH machen?
HGDIOBJ oldbitmap = SelectObject(hdc, bitmap); HGDIOBJ oldbrush = SelectObject(hdc, brush); HGDIOBJ oldpen = SelectObject(hdc, pen); Rectangle(hdc, 10, 10, 100, 100); SelectObject(hdc, oldpen); SelectObject(hdc, oldbrush); SelectObject(oldbitmap);
Und abgesehen davon versteh ich die Funktionsweise nicht ganz. Woher "weiss" SelectObject was ein Pen oder Brush ist - wird irgendeine Art RTTI benutzt?
-
Hallo,
GDI Anfaenger schrieb:
Meine Frage ist, muss ich das auch fuer HPEN und HBRUSH machen??
Ja, steht im Abschnitt "Remarks" zu SelectObject
GDI Anfaenger schrieb:
Und abgesehen davon versteh ich die Funktionsweise nicht ganz. Woher "weiss" SelectObject was ein Pen oder Brush ist - wird irgendeine Art RTTI benutzt?
In einem GDI-Objekt könnte man sich vorstellen, dass dort irgendein Kennzeichen des "Typs", an immer gleicher Stelle aller GDI-Objekte, vorliegt, so dass SelectObject dieses Kennzeichen immer findet und "erkennt", um welches GDI-Objekt es sich handelt.
MfG,
Probe-Nutzer
-
GDI Anfaenger schrieb:
HGDIOBJ old = SelectObject(hdc, bitmap); Rectangle(hdc, 10, 10, 100, 100); SelectObject(hdc, old);
Der Code macht doch schon aus zwei Gründen keinen Sinn: Rectangle berücksichtigt in keiner Weise die eingewählte Bitmap und zweitens ist "old" bei einem z.B. per BeginPaint angeforderten DC immer 0 - sprich, es ist keine Bitmap verknüpft.
Anders sieht es natürlich bei Brushes, Pens Fonts etc. aus.
-
Danke @Probe-Nutzer
Ich finde, es ist etwas umstaendlich geloest (und btw, einige Tutorials machen das gar nicht), aber was solls.@mapper
Funktioniert bei mir einwandfrei, wird auch auf verschiedenen Seiten genau so erklaert.
Und nein, SelectObject gibt niemals 0 zurueck (getestet).