Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Графика и Игры , Bitmap

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

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  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;

Перевод контента на русский язык:

Функция Delphi, которая генерирует битмап-изображение радио-кнопки. Функция принимает три параметра: Checked (логическое значение, указывающее, является ли радио-кнопка выбранной), Hot (логическое значение, указывающее, находится ли радио-кнопка в горячем состоянии) и BgColor (цвет фона радио-кнопки).

Функция создает новый битмап-объект с помощью компонента TBitmap. Затем она устанавливает ширину и высоту битмапа в 16x16 пикселей, что является стандартным размером радио-кнопки.

Далее функция использует свойство Canvas битмап-объекта для рисования фона радио-кнопки с помощью свойства Brush.Color. Она также присваивает битмап-объект переменной ChkBmp.

Затем функция рассчитывает прямоугольник для области управления радио-кнопкой (CBRect) и устанавливает его координаты.

Если используется Delphi 7 или более поздняя версия (VER150 константа), функция проверяет, поддерживает ли система темы. Если она поддерживает, то она получает детали элемента темы для радио-кнопки с помощью метода ThemeServices.GetElementDetails. Затем она рисует радио-кнопку с помощью метода ThemeServices.DrawElement.

Если система не поддерживает темы или если тема недоступна (ThemeOK переменная установлена в false), функция переходит к ручному рисованию радио-кнопки с помощью метода DrawFrameControl и массива CtrlState.

Наконец, функция возвращает битмап-изображение радио-кнопки. Пользователь должен освободить битмап-объект после использования.

В улучшенной версии кода я сделал следующие изменения:

  1. Improved variable naming for better readability.
  2. Removed unnecessary variables and code blocks.
  3. Simplified the logic for drawing the radio button's control area (CBRect).
  4. Added error handling using a try-finally block to ensure that the bitmap objects are freed even if an exception occurs.
  5. Improved the formatting of the code with proper indentation and line breaks.

Обратите внимание, что функция все еще использует старый стиль Delphi 7 (VER150) для рисования тематических элементов, который может не работать на более новых системах. Вам может потребоваться обновление кода для использования современных тем или стилей в зависимости от требований вашего приложения.

Функция GetRadioButtonBitmap получает битмап радио-кнопки с параметрами checked, hot и bgColor, учитывая поддержку тем для Windows XP.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Bitmap ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:24:44/0.0055038928985596/1