![]() |
Größe von Checkbox/RadioButton bei großen Schriftarten
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:
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.
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; 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. |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Du kannst doch den Standardfont und seine Eigenschaften ermitteln, oder stellt das irgendein Problem dar?
Und dann ist mir noch aufgefallen, daß du mit relativ kleinen Integers arbeitest, wäre es da nicht besser auf Gleitkommazahlen auszuweichen und zum spätestmöglichen Zeitpunkt zu runden? Und noch eine Frage, passiert das nur bei aktivierten Themes oder in beiden Fällen? |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Das mit dem Rundungsfehlern dürfte nicht das Problem sein da ich Division nur einmal in MulDivPixelsPerInch habe.
Das Problem das ich genau habe ist ein (bei Standardfarben) ein weiser "Trauerrand", da mit mit Theming die Checkbox kleiner ist als meine Berechnung. Ohne XP-Theming passt es da DrawFrameControl so groß Zeichnet wie ich will (könnte auch Checkboxen mit 200*200 Pixel anfragen). Ich habe mich jetzt folgendermaßen geholfen: Da ich ein Grid habe und dort die "umgebende Farbe" weis (selektiert, nicht, focusiert, ...) fülle ich das Bitmap erstmal mit dieser Farbe. Das mit den Standardfonts muß ich nochmal checken. Aber ich vermute das dieser um die 50% wächst und damit mir nicht hilft. |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Irgendwie steige ich nicht so ganz hinter das Problem. :gruebel:
Aber wenn ich das richrig verstehe willst du doch "nur" eine Checkbox irgenwohin zeichnen, die sich an die Aktuelle Schriftart/-größe anpasst? Meine Idee: Du könntest doch einfach die betreffende Schriftart deinem Canvas zuordnen und dann anhand von .TextWidth und .TextHeight deine Box skalieren. Falls das nun totaler Nonsens war den ich hier von mir gegeben habe, bitte ich um Entschuldigung, denn dann habe ich das Problem nicht verstanden. :stupid: |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Zitat:
Ansonsten würde ja meine Funktion Opti-Propti gehen. |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Zitat:
Was meint Windows wie? Oder meinst du das Standard-Windows-Verhalten oder was? Gruß Mr_G |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Zitat:
@Bernhard: jetzt habe ich es erstmal komplett kapiert. Also taucht das Problem also nur beim Theming auf. Das schaue ich mir heute mal an. Aber dein Workaround klingt eigentlich vernünftig, da man es ja immer so machen sollte (vorher mit "Standardfarbe" löschen -> WM_ERASEBKGND). Kannst du mal ein paar verschiedene Screenshots anhängen? |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Danke! Jetzt habe ich das Problem auch verstanden... :???:
Wenn ich nun noch wüsste wie die Microsofties auf diese seltsame Skalierung kommen könnte ich auch weiterhelfen. Da ich das aber leider nicht weiß kann ich auch nicht helfen. Sorry! :| |
Re: Größe von Checkbox/RadioButton bei großen Schriftarten
Hallo Bernhard,
das hier ist wahrscheinlich nur ein Flüchtigkeitsfehler:
Delphi-Quellcode:
Zu deinem eigentlichen Problem: in
function MulDivPixelsPerInch(Value: Integer): Integer;
begin if Assigned(Screen) then // result := MulDiv(CheckBoxSize, Screen.PixelsPerInch, 96) result := MulDiv(Value, Screen.PixelsPerInch, 96) else result := 1; end; ![]()
Delphi-Quellcode:
Vielleicht hilft es.
var
FCheckWidth : Integer; FCheckHeight : Integer; procedure GetCheckSize; begin with TBitmap.Create do try Handle := LoadBitmap(0, PChar(OBM_CHECKBOXES)); FCheckWidth := Width div 4; FCheckHeight := Height div 3; finally Free; end; end; Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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