AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Größe von Checkbox/RadioButton bei großen Schriftarten
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Bernhard Geyer · begonnen am 3. Jan 2007 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

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

  Alt 3. Jan 2007, 16: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
Olli
(Gast)

n/a Beiträge
 
#2

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

  Alt 7. Jan 2007, 06:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 7. Jan 2007, 08:52
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#4

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

  Alt 7. Jan 2007, 10:48
Irgendwie steige ich nicht so ganz hinter das Problem.
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.
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 7. Jan 2007, 12:04
Zitat von Mr_G:
Irgendwie steige ich nicht so ganz hinter das Problem.
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.
Das problem ist aber das die Schriften um 50% größer werden aber Windows meint das die Checkbox nur um 25% wachsen sollen.
Ansonsten würde ja meine Funktion Opti-Propti gehen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 7. Jan 2007, 14:34
Zitat von Bernhard Geyer:
Das problem ist aber das die Schriften um 50% größer werden aber Windows meint das die Checkbox nur um 25% wachsen sollen.
Ansonsten würde ja meine Funktion Opti-Propti gehen.
Wie gesagt... ich hatte es wohl nicht verstanden und - ich verstehe es jetzt immer noch nicht.
Was meint Windows wie? Oder meinst du das Standard-Windows-Verhalten oder was?
Gruß

Mr_G
Jan
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

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

  Alt 7. Jan 2007, 15:42
Zitat von Mr_G:
Wie gesagt... ich hatte es wohl nicht verstanden und - ich verstehe es jetzt immer noch nicht.
Was meint Windows wie? Oder meinst du das Standard-Windows-Verhalten oder was?
Ja, er meint die Skalierung aller Schriften (Rechtsklick auf Desktop, Eigenschaften, letztes Tab, Erweitert, Allgemein). Das hat bspw. für Sehbehinderte eine Bewandnis und kann so eine große Hilfe sein.

@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?
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 7. Jan 2007, 15:57
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!
Jan
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

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

  Alt 7. Jan 2007, 17:07
Hallo Bernhard,

das hier ist wahrscheinlich nur ein Flüchtigkeitsfehler:

Delphi-Quellcode:
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;
Zu deinem eigentlichen Problem: in diesem Thread wird vorgeschlagen, sich an der TCheckListBox der VCL zu orientieren. Dort gibt es eine Routine, welche die Dimension der Checkbox mit Hilfe einer System-Bitmap ermittelt:

Delphi-Quellcode:
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;
Vielleicht hilft es.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz