Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
Новичек   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
1-1091688013
serg128
2004-08-05 10:40
2004.08.22
Как скопировать в буфер всю строку из Grid?


1-1091902043
Star
2004-08-07 22:07
2004.08.22
Разбор строки по флагу


1-1091484317
denkop
2004-08-03 02:05
2004.08.22
"Правильное" завершение работы программы


3-1091101066
Andrey
2004-07-29 15:37
2004.08.22
Создание индекса


3-1090953886
sloug
2004-07-27 22:44
2004.08.22
Нужно посчитать





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский