![]() |
SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Hallo,
Wenn man ein HFont einer TFont-Klassenvariabeln einen DC per SelectObject zuweist, kommt als Result ja wieder ein Handle. Muss man das Handle sichern und am Ende nach dem eigentlichen Zeichen wieder auf das DC zurück selektieren? DeleteObject geht aber auf jeden Fall nicht, weil man ja so das TFont-Objekt beschädigt und die Eigenschaften (Größe, Art, Farbe) flöten gehen. Diese Routine wird jede Sekunde aufgerufen (Zeit auf eine IDirectDraw7 Surface zeichnen). Kann es durch den unten stehenden Code zu einen Anstieg des Speicherverbrauchs kommen?
Delphi-Quellcode:
// Text mit Formattierungen in den DC zeichnen und Rect berechnen
function TMyClass.DrawTextDC(aDC : HDC; aDCSize : TPoint; const S : UnicodeString; Position : TextPosition) : Boolean; var DrawRes : integer; tmpRect : TRect; ShiftX, ShiftY : integer; DrawTextFlags : UINT; begin tmpRect.Top := 1; tmpRect.Left := 1; tmpRect.Bottom := aDCSize.Y; // fDstSize.Bottom; tmpRect.Right := aDCSize.X; // fDstSize.Right; DrawTextFlags := DT_WORDBREAK OR DT_EXPANDTABS OR DT_TABSTOP OR DT_WORD_ELLIPSIS; case Position of tpNone, tpBelow, tpTopLeft, tpBotLeft: DrawTextFlags := DrawTextFlags OR DT_LEFT; tpTopRight, tpBotRight: DrawTextFlags := DrawTextFlags OR DT_RIGHT; tpCenter : DrawTextFlags := DrawTextFlags OR DT_CENTER; end; test := SelectObject(aDC, FTextFont.Handle); // Erst mal die Größe berechnen: DrawTextExW(aDC,PWideChar(S),Length(S),tmpRect, DrawTextFlags or DT_CALCRECT, @FTextParams.DrawTextParams); // Jetzt verschieben: ShiftX := 0; ShiftY := 0; case Position of tpCenter : begin ShiftX := (aDCSize.X - tmpRect.Right) div 2; ShiftY := (aDCSize.Y - tmpRect.Bottom) div 2; end; tpBelow, tpBotLeft : ShiftY := aDCSize.Y - tmpRect.Bottom; tpBotRight: begin ShiftX := aDCSize.X - tmpRect.Right - 1; ShiftY := aDCSize.Y - tmpRect.Bottom; end; tpTopRight: ShiftX := aDCSize.X - tmpRect.Right - 1; end; OffsetRect(tmpRect, ShiftX, ShiftY); // Für die Links alignten Versionen das Rechteck nach rechts vergrößern: (XP Bug) case Position of tpNone, tpBelow, tpTopLeft, tpBotLeft : tmpRect.Right := aDCSize.X - 1; end; // Berechnetes Rect erst mal für außen speichern if FTextParams.Transparent then begin SetBkMode (aDC, TRANSPARENT); SetBkColor(aDC, FKeyColor); // Den Schatten zeichnen SetTextColor(aDC,FTextParams.BkgColor); DrawTextExW(aDC,PWideChar(S),Length(S),tmpRect, DrawTextFlags, @FTextParams.DrawTextParams); end else begin SetBkMode (aDC, OPAQUE); SetBkColor(aDC, FTextParams.BkgColor); end; // Vordergrund zeichnen SetTextColor(aDC,FTextParams.Color); // Rect verschieben: OffsetRect(tmpRect, -1, -1); DrawRes := DrawTextExW(aDC, PWideChar(S), Length(S), tmpRect, DrawTextFlags, @FTextParams.DrawTextParams); Result := (DrawRes = 0); end; |
AW: SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Ich frag mal anderes:
Wenn ein SelectObject auf ein DC gemacht wurde, welche Schritte muss man definitiv nach dem Zeichnen unternehmen? |
AW: SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Ich will ja nicht pushen, aber arbeitet denn keiner mehr mit GDI-Befehlen auf DCs?
|
AW: SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Also ich kenne das so, dass man das "handle", welches ein SelectObject zurückgibt, auch wieder "zurückgeben" muss.
Heißt (Pseudocode):
Code:
TempHandle := SelectObject(DC, Object.Handle);
TuWas(...); SelectObject(DC,TempHandle); |
AW: SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Zitat:
![]() Und wenn man dann in das zugehörige Beispiel schaut:
Code:
original = SelectObject(hdc,GetStockObject(DC_PEN));
... // Restoring the original object SelectObject(hdc,original); // It is not necessary to call DeleteObject to delete stock objects. |
AW: SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Zitat:
Und in den MSDN-Beispielen werden immer in der jeweiligen Funktion GDI-Objekte erzeugt. In meinen Fall ist das TFont nebst HFont immer da. Muss man dann das zweifache SelectObject machen? |
AW: SelectObject bei TFont.Handle - möglicher Speicherschmierer?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz