Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Получить bitmap радио кнопок

01.01.2007
{ 
 
Diese Funktion liefert ein Bitmap eines RadioButton.
 
 
Parameter:
 
Checked = RadioButton ausgewahlt
 
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 Ausfuhrung der Funktion wieder freigegeben werden!
  XP
-Styles werden erst ab Delphi7 unterstutzt.
}
 
 
 
Code:{$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}
   
BgOld : TColor;
   
ChkBmp : TBitmap;
   
ThemeOK : boolean;
   x
, x2, y : integer;
 
begin
   
Result := nil;
   
try
     
Result := TBitmap.Create;
     
ChkBmp := TBitmap.Create;
     
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 = True then
           
begin
             
if Hot = True then
               
Details := ThemeServices.GetElementDetails(tbRadioButtonCheckedHot)
             
else
               
Details :=
                 
ThemeServices.GetElementDetails(tbRadioButtonCheckedNormal);
           
end
           
else
           
begin
             
if Hot = True then
               
Details :=
                 
ThemeServices.GetElementDetails(tbRadioButtonUncheckedHot)
             
else
               
Details :=
                 
ThemeServices.GetElementDetails(tbRadioButtonUncheckedNormal);
           
end;
           
ThemeServices.DrawElement(Handle, Details, CBRect);
           
//Prufen ob es tatsachlich 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 ThemeOK = False 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;
     
end;
   
finally
   
end;
 
end;