Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#1

SelectObject bei TFont.Handle - möglicher Speicherschmierer?

  Alt 1. Feb 2012, 15:33
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;
  Mit Zitat antworten Zitat