AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Object-Pascal / Delphi-Language Delphi ... ein Bitmap eines RadioButton erhalten

... ein Bitmap eines RadioButton erhalten

Ein Thema von FriFra · begonnen am 29. Mai 2003 · letzter Beitrag vom 29. Mai 2003
Antwort Antwort
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

... ein Bitmap eines RadioButton erhalten

  Alt 29. Mai 2003, 16:11
Diese Funktion liefert ein Bitmap eines RadioButton.

Parameter:
Checked = RadioButton ausgewählt
Hot = RadioButton aktiv (funktioniert nur unter XP und bewirkt z.B. unter Luna einen hellroten Rand)
BgColor = Hintergrundfarbe des RadioButton

Wichtig:
Die Bitmap sollte nach Ausführung der Funktion wieder freigegeben werden!
XP-Styles werden erst ab Delphi7 unterstützt.

Delphi-Quellcode:
{$IFDEF VER150}
uses
  Themes;
{$ENDIF}

function GetRadioButtonBitmap(Checked, Hot: Boolean; BgColor: TColor): TBitmap;
const
  CtrlState: array[Boolean] of Integer = (DFCS_BUTTONRADIO,
    DFCS_BUTTONRADIO or DFCS_CHECKED);
var
  CBRect: TRect;
{$IFDEF VER150}
  Details: TThemedElementDetails;
{$ENDIF}
  ChkBmp: TBitmap;
  ThemeOK: Boolean;
  x, y: Integer;
begin
  Result := nil;
  try
    Result := TBitmap.Create;
    ChkBmp := TBitmap.Create;
    try
      ThemeOK := False;
      with Result do
      begin
        Width := 16;
        Height := 16;
        with Canvas do
        begin
          Brush.Color := BgColor;
          FillRect(ClipRect);
          ChkBmp.Assign(Result);
          CBRect := ClipRect;
          CBRect.Top := 1;
          CBRect.Left := 1;
{$IFDEF VER150}
          if ThemeServices.ThemesAvailable then
          begin
          //ab WinXP
            if Checked then
            begin
              if Hot = True then
                Details := ThemeServices.GetElementDetails(tbRadioButtonCheckedHot)
              else
                Details :=
                  ThemeServices.GetElementDetails(tbRadioButtonCheckedNormal);
            end
            else
            begin
              if Hot then
                Details :=
                  ThemeServices.GetElementDetails(tbRadioButtonUncheckedHot)
              else
                Details :=
                  ThemeServices.GetElementDetails(tbRadioButtonUncheckedNormal);
            end;
            ThemeServices.DrawElement(Handle, Details, CBRect);
          //Prüfen ob es tatsächlich geklappt hat (Win2003 liefert leere Images!)
            for x := 15 downto 0 do
              for y := 15 downto 0 do
                if ChkBmp.Canvas.Pixels[x, y] <> Pixels[x, y] then
                begin
                  ThemeOK := True;
                  Break;
                end;
          end;
{$ENDIF}
          if not ThemeOK then
          begin
          //alles vor WinXP
            CBRect.Left := ClipRect.Left + 2;
            CBRect.Right := ClipRect.Right - 1;
            CBRect.Top := ClipRect.Top + 2;
            CBRect.Bottom := ClipRect.Bottom - 1;
            DrawFrameControl(Handle, CBRect, DFC_BUTTON, CtrlState[Checked]);
          end;
        end; // with Canvas
      end; // with Result
    finally
      ChkBmp.Free;
    end;
  finally
  end;
end;
Beispielaufruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  rbBitmap: TBitmap;
begin
  rbBitmap := GetRadioButtonBitmap(True, True, clBtnFace);
  Image1.Picture.Bitmap.Assign(rbBitmap);
  rbBitmap.Free;
end;
[Edit=Sakura]Delphi-TAGS gesetzt.[/Edit]
[Edit=FriFra]Problembehandlung Win2003[/Edit]
[Edit=FriFra]Compilerdirektive für ältere Delphi Versionen[/Edit]
[Edit=toms]Memory Leak: ChkBmp wurde nicht freigegeben und Beispielaufruf hinzugefügt[/Edit]

Geändert von toms (28. Nov 2010 um 08:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#2
  Alt 29. Mai 2003, 21:17
Ich musste noch ein paar kleine Änderungen machen, damit der Code auch unter Win2003 läuft und sich auch ohne Delphi7 compilieren lässt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf