Einzelnen Beitrag anzeigen

Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#1

Größe von Checkbox/RadioButton bei großen Schriftarten

  Alt 3. Jan 2007, 17:28
Ich brauche für meine Anwendung die größe der CheckBox bzw. des RadioButtons bisher versuche ich mit folgenden Code auch große Schriftarten korrekt bezüglich der veränderten größe der Checkboxen abzubilden:


Delphi-Quellcode:
const
  CheckBoxSize = 13;

procedure DrawMyGridCheckBox(Grid: TMyGrid; Checked: Boolean; Surface: TCanvas; R: TRect);

  function MulDivPixelsPerInch(Value: Integer): Integer;
  begin
    if Assigned(Screen) then
      result := MulDiv(CheckBoxSize, Screen.PixelsPerInch, 96)
    else
      result := 1;
  end;

var
  pid, sid: Integer;
  Bitmap: TBitmap;
  CheckRect: TRect;
  RealRect: TRect;
  i: Integer;
  CheckTheme: HTheme;
begin
  Bitmap := TBitmap.Create;
  try
    // Berücksichtige lineare vergößerung aufgrund des Schriftgrades
    Bitmap.Width := MulDivPixelsPerInch(CheckBoxSize);
    Bitmap.Height := MulDivPixelsPerInch(CheckBoxSize);

    if Grid.IsThemeApplied then
    begin
      pid := BP_CHECKBOX;

      if Checked then
        sid := CBS_CHECKEDNORMAL
      else
        sid := CBS_UNCHECKEDNORMAL;

      CheckRect := Rect(0, 0, Bitmap.Width, Bitmap.Height);

      CheckTheme := OpenThemeData(Grid.Handle, 'BUTTON');
      try
// GetThemeBackgroundContentRect(CheckTheme, Bitmap.Canvas.Handle, pid, sid, CheckRect, RealRect);
// GetThemeBackgroundExtent(CheckTheme, Bitmap.Canvas.Handle, pid, sid, @CheckRect, RealRect);
        DrawThemeBackground(CheckTheme, Bitmap.Canvas.Handle, pid, sid, CheckRect, nil);
      finally
        CloseThemeData(CheckTheme);
      end;
    end
    else
    begin
      if Checked then
        i := DFCS_BUTTONCHECK or DFCS_CHECKED
      else
        i := DFCS_BUTTONCHECK;

      DrawFrameControl(Bitmap.Canvas.Handle, Rect(0, 0, Bitmap.Width, Bitmap.Height), DFC_BUTTON, i);
    end;

    // Grenzen setzen damit nicht auserhalb zugewiesener Zeichenfläche ....
    CheckRect.Left := Max(R.Left, R.Left + (R.Right - R.Left - Bitmap.Width) div 2);
    CheckRect.Top := Max(R.Top, R.Top + (R.Bottom - R.Top - Bitmap.Height) div 2);
    CheckRect.Right := Min(R.Right, CheckRect.Left + Bitmap.Width);
    CheckRect.Bottom := Min(R.Bottom, CheckRect.Top + Bitmap.Height);

    // Kopieren auf Grid-Canvas
    bitblt(Surface.Handle, CheckRect.Left, CheckRect.Top, CheckRect.Right - CheckRect.Left,
           CheckRect.Bottom - CheckRect.Top, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
  finally
    Bitmap.Free;
  end;
end;
Aber irgendwie werden meine Checkboxen z.B. bei Schriftgröße 150% zu große. Ich bekomme eine CheckBox von 20*20, jedoch verwendet Windows die Größe 16 was nur eine vergrößerung des Controls um 25% ausmacht.

Irgendeiner eine Idee wie ich diese größe herausbekomme? Die auskommentierten GetThemeBackground...-Funktionen bringen auch nichts. Ich brauche aber die korrekte größe damit ich keinen Trauerrand bekomme wenn z.B. die Zeile fokusiert ist und damit der Focusrahmen nicht mehr komplett anliegt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat