Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.02 c
14-1091515161
User_OKA
2004-08-03 10:39
2004.08.22
Win 98


3-1091022448
r00t
2004-07-28 17:47
2004.08.22
Как отобразить формулы и т.д. в бд?


14-1091007987
Gero
2004-07-28 13:46
2004.08.22
Электронные книги


11-1077964306
nsvi
2004-02-28 13:31
2004.08.22
Проблемы с KOLWebBrowser


1-1091873765
Alexis
2004-08-07 14:16
2004.08.22
На форме не появляется TStatusBar




   Наверх