Главная страница
    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.46 MB
Время: 0.033 c
9-1083603086
Tsaiper
2004-05-03 20:51
2004.08.22
random збесился. что делать?


1-1092126263
anarhi
2004-08-10 12:24
2004.08.22
Цвета


4-1089393305
Neutrino
2004-07-09 21:15
2004.08.22
Повелитель CD-ROM а.


4-1089718674
rOOse
2004-07-13 15:37
2004.08.22
Нажатие на кнопку. WinApi


14-1091768892
Anatoly Podgoretsky
2004-08-06 09:08
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский