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

Форма окна по Bitmap

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

Форма окна по Bitmap

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

unit Unit1;

 interface

 uses
   Windows, Classes, SysUtils, Graphics, Forms;

 type
   TRGBArray = array[0..32767] of TRGBTriple;
   PRGBArray = ^TRGBArray;

 type
   TForm1 = class(TForm)
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
   private
     { Private declarations }
     FRegion: THandle;
     function CreateRegion(Bmp: TBitmap): THandle;
   end;

 var
   Form1: TForm1;

 implementation

 {$R *.dfm}

 function TForm1.CreateRegion(Bmp: TBitmap): THandle;
 var
   X, Y, StartX: Integer;
   Excl: THandle;
   Row: PRGBArray;
   TransparentColor: TRGBTriple;
 begin
   Bmp.PixelFormat := pf24Bit;

   Result := CreateRectRGN(0, 0, Bmp.Width, Bmp.Height);

   for Y := 0 to Bmp.Height - 1 do
   begin
     Row := Bmp.Scanline[Y];

     StartX := -1;

     if Y = 0 then
       TransparentColor := Row[0];

     for X := 0 to Bmp.Width - 1 do
     begin
       if (Row[X].rgbtRed = TransparentColor.rgbtRed) and
         (Row[X].rgbtGreen = TransparentColor.rgbtGreen) and
         (Row[X].rgbtBlue = TransparentColor.rgbtBlue) then
       begin
         if StartX = -1 then StartX := X;
       end
       else
       begin
         if StartX > -1 then
         begin
           Excl := CreateRectRGN(StartX, Y, X + 1, Y + 1);
           try
             CombineRGN(Result, Result, Excl, RGN_DIFF);
             StartX := -1;
           finally
             DeleteObject(Excl);
           end;
         end;
       end;
     end;

     if StartX > -1 then
     begin
       Excl := CreateRectRGN(StartX, Y, Bmp.Width, Y + 1);
       try
         CombineRGN(Result, Result, Excl, RGN_DIFF);
       finally
         DeleteObject(Excl);
       end;
     end;
   end;
 end;

 procedure TForm1.FormCreate(Sender: TObject);
 var
   Bmp: TBitmap;
 begin
   Bmp := TBitmap.Create;
   try
     Bmp.LoadFromFile('C:\YourBitmap.bmp');
     FRegion := CreateRegion(Bmp);
     SetWindowRGN(Handle, FRegion, True);
   finally
     Bmp.Free;
   end;
 end;

 procedure TForm1.FormDestroy(Sender: TObject);
 begin
   DeleteObject(FRegion);
 end;

 end.

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

Это код на Delphi, который создает форму с изображением bitmap и применяет регион к окну в соответствии с прозрачностью изображения.

Рассмотрим подробно код:

  • Тип TRGBArray - это массив 24-битных RGB-тройок.
  • Класс TForm1 наследуется от TForm и имеет два процедура: FormCreate и FormDestroy. FormCreate вызывается при создании формы, а он загружает изображение bitmap из файла и создает регион на основе прозрачности изображения. FormDestroy вызывается при уничтожении формы, а он удаляет регион.
  • Функция CreateRegion принимает объект TBitmap в качестве входного параметра и возвращает.handle для региона. Она перебирает каждый пиксель в bitmap, проверяет, является ли пиксель прозрачным (т.е., его RGB-значения равны RGB-значениям первого пикселя). Если пиксель не прозрачен, она создает прямоугольник для этого пикселя и комбинирует его с существующим регионом с помощью CombineRGN.
  • В процедуре FormCreate создается новый объект TBitmap, загружается из файла и передается в функцию CreateRegion. Результатом является handle для региона, который затем устанавливается как регион окна с помощью SetWindowRGN.

Код также включает в себя обработку ошибок с использованием блоков try-finally для обеспечения освобождения ресурсов даже в случае исключений.

Некоторые предложения по улучшению:

  • Рассмотрите более надежный метод определения прозрачности, например, проверка канала альфа пикселя.
  • Используйте более эффективный алгоритм комбинирования регионов, например, с использованием CombineRGN с RGN_OR вместо перебора каждого пикселя.
  • Рассмотрите использование более современной версии Delphi, которая поддерживает строковые типы Unicode и другие функции.

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

В статье описывается способ создания прозрачной формы в Delphi, используя битовую картинку (Bitmap) для определения областей, которые должны быть прозрачными.


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

Получайте свежие новости и обновления по 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 11:54:04/0.0038838386535645/0