Форум: "Потрепаться";
Текущий архив: 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