Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Помогите пожалуйста разобраться.   Найти похожие ветки 

 
Новичек   (2004-08-02 16:33) [0]

Мой вопрос почему то удалили. А я не знаю куда его адресовать. Может хоть отсюда не удалят.

Вопрос такой - как сделать форму в виде региона на основе имеющегося битмапа. Как скины у Winampa - какой скин, такой формы и сам Winamp.
Я знаю что это как -то делается, а вот как не знаю. Если знаете напишите пожалуйста ссылочку, потому что мне надо смотреть сам рабочий код чтобы разобраться. А ответы вроде : "нужно попиксельно исследовать битмап" мне ничего не дадут, потому что я этого не умею, а разобраться очень хочется.


 
Кириешки ©   (2004-08-02 16:51) [1]

То есть надо чтобы было так : Есть рисунок - например два круга разного диаметра, один в одном. Внутренний черный, а внешний например желтый. Транспанентные цвета - прозрачные, значит надо чтобы форма стала круглой с дыркой внутри вместо внутреннего круга? Так?


 
clickmaker ©   (2004-08-02 16:53) [2]

CreatePolygonRgn
CreateEllipticRgn
SetWindowRgn


 
Sergey Kaminski ©   (2004-08-02 16:55) [3]

Сейчас напишу примерчик.


 
Sergey Kaminski ©   (2004-08-02 17:15) [4]


procedure TForm1.FormCreate(Sender: TObject);
var
 FormRGN,PixRGN: HRGN;
 x,y: Integer;
begin
 BorderStyle := bsNone; // убираем рамку формы
 Width := Image1.Width;  // Подстраиваем размеры формы под картинку
 Height := Image1.Height; //

 // создаем регион по текущим размерам формы
 FormRGN := CreateRectRgn(0,0,Width,Height);

 // проходимся в цикле по всем пикселам картинки
 for x := 0 to Image1.Picture.Bitmap.Width do
   for y := 0 to Image1.Picture.Bitmap.Height do
   begin

     // если цвет пиксела картинка равен "прозрачному" цвету
     // (пусть "прозрачным" будет белый)
     if Image1.Picture.Bitmap.Canvas.Pixels[x,y] = clWhite then
     begin
       // создаем регион по размеру текущего пиксела
       PixRGN := CreateRectRgn (x,y,x+1,y+1);

       // "вырезаем" из первоначального региона "прозрачную" точку
       // см. справку по всем параметрам данной функции
       CombineRgn(FormRGN,FormRGN,PixRGN,RGN_XOR);

       // уничтожаем вспомогательный регион
       DeleteObject (PixRGN);
     end;

   end;

 // устанавливаем новый регион для формы
 SetWindowRgn(Handle,FormRGN,True);
 // Внимание: уничтожать его после этого нельзя,
 // так как он находится "во владении" системы
end;


Вот пример, написанный на коленке.

На форме TImage(Visible := False) с картинкой, в которой прозрачный цвет clWhite.

Общий принцип виден.
Пример отрабатывает достаточно медленно. Это из-за того, что мы попиксельно обращаемся к картинке в цикле. Для оптимизации следует использовать свойство ScanLine, см. в документации.


 
Новичек   (2004-08-02 17:34) [5]

Sergey Kaminski ©

Спасибо вам большое!!! Буду разбираться!!!



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
1-1092148967
mikle
2004-08-10 18:42
2004.08.22
Добрый день. Подскажите как у списка


14-1091696301
Sir John
2004-08-05 12:58
2004.08.22
Registry, xml, ini и другие товарищи


14-1091744186
tsalBSM
2004-08-06 02:16
2004.08.22
Пркоил


3-1090847005
MORA
2004-07-26 17:03
2004.08.22
Master-Detail


14-1091532907
ИМХО
2004-08-03 15:35
2004.08.22
Delphi + Lamer = ?