Registriert seit: 13. Aug 2002
17.201 Beiträge
Delphi 10.4 Sydney
|
Größe von Checkbox/RadioButton bei großen Schriftarten
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.
|