Главная страница
    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.46 MB
Время: 0.037 c
14-1090698815
Marser
2004-07-24 23:53
2004.08.22
Уезжаю!


1-1091481675
QuestionX
2004-08-03 01:21
2004.08.22
Рисование на форме поверх всех компонентов


14-1089984552
Esu
2004-07-16 17:29
2004.08.22
ХеХе, жители Украины я думаю поймут :)


3-1091118297
cherrex
2004-07-29 20:24
2004.08.22
IBDataSet


1-1091607642
афвуд
2004-08-04 12:20
2004.08.22
Модальное окно без ShowModal? Как?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский