Форум: "WinAPI";
Текущий архив: 2003.03.17;
Скачать: [xml.tar.bz2];
ВнизRegion Functions Найти похожие ветки
← →
Cosmic (2003-01-21 21:11) [0]Здравствуйте, мастера!
Вопрос такой: я знаю, что существуют функции создания и управления регионами,
но как их применять, честно говоря, не очень себе представляю. Как с ними работать?
Как создавать регионы и объединять их? Если не сложно, с примерами, плиз.
А нужно мне вот что: взять произвольную BMP-шку и создать окно, имеющее форму этой
BMP-шки (наподобие Автозапуска на CHIP-CD). Буду оч-ч-ень благодарен за примеры.
Заранее спасибо.
← →
Billy (2003-01-22 03:30) [1]Здесь, насколько мне известно, применяется такая тактика:
1) Создается прямоугольный регион (под размер рисунка).
Функция CreateRectRgn.
2) В цикле ищутся горизонтальные линии (прозрачного цвета)толщиной в 1 пиксель и создаются прямоугольные регионы под размер этих областей.
3) При помощи CombineRgn с параметром RGN_DIFF "вычитаем" из 1-го региона второй (из общего - тоненький)
4) Вызываем SetWindowRgn.
5) Балдеем! :-)
← →
Игорь Шевченко (2003-01-22 09:39) [2]Про регион из BMP - есть статья Антона Григорьева на "Королевстве Delphi" (www.delphikingdom.com)
← →
Cosmic (2003-01-22 22:40) [3]Я пишу примерно так:
var
Rgn, Rgn1, Rgn2: HRGN;
...
Rgn1 := CreateRectRgn(50,50,100,100);
Rgn2 := CreateEllipticRgn(100,100,150,100);
CombineRgn(Rgn, Rgn1, Rgn2, RGN_OR);
SetWindowRgn(Form1.Handle, Rgn, True);
Но не работает! Выводит простую форму. В чем проблема?
← →
Юрий Зотов (2003-01-22 23:26) [4]http://www.delphikingdom.com/helloworld/samples_win.htm#link11
Проект-пример Cunnings.zip
(CreateXXXRgn, CombineRgn, SetWindowRgn и еще кое-что)
← →
Mihey (2003-01-22 23:41) [5]Вот функции создания и десоздания регионов:
procedure CropWindow( Handle: HWnd; Picture : TPicture );
var
hrgn, hrgn1 : integer;
hdc : integer;
x, y : integer;
Color : TColor;
begin
// Color := Picture.Bitmap.Canvas.Pixels[ 0, 0 ];
Color := clWhite;
hdc := GetDC( Handle );
hrgn := CreateRectRgn( 0, 0, Picture.Graphic.Width, Picture.Graphic.Height );
for x := 1 to Picture.Graphic.Width do
for y := 1 to Picture.Graphic.Height do
if Picture.Bitmap.Canvas.Pixels[ x - 1, y - 1 ] = Color then begin
hrgn1 := CreateRectRgn( x - 1, y - 1, x, y);
CombineRgn( hrgn, hrgn, hrgn1, RGN_DIFF );
DeleteObject( hrgn1 );
end;
SetWindowRgn( Handle, hrgn, true );
//DeleteObject( hrgn );
ReleaseDC( Handle, hdc);
end;
//============================================================================//
//============================================================================//
//============================================================================//
procedure UncropWindow( Handle: HWnd; Picture : TPicture );
var
hrgn : integer;
hdc : integer;
begin
hdc := GetDC( Handle );
hrgn := CreateRectRgn( 0, 0, Picture.Graphic.Width , Picture.Graphic.Height );
SetWindowRgn( Handle, hrgn, true );
ReleaseDC( Handle, hdc );
end;
Как раз с BMP"шкой.
← →
MBo (2003-01-23 06:13) [6]>Cosmic © (22.01.03 22:40)
Ошибка в том, что приемный регион в CombineRgn уже должен быть создан! Можно использовать один из исходных или создать еще один
← →
Cosmic (2003-01-24 10:19) [7]Отлично, спасибо. Еще вопрос: при перехвате WM_NCLBUTTONDOWN (то есть, если я хочу, чтобы форма двигалась, когда я ее хватаю мышкой за любое место) перемещается не регион, который мной создан, а весь контур формы. Можно ли этого избежать?
← →
MBo (2003-01-24 10:28) [8]вероятно, если PtInRegion, то не вызывать унаследованный обработчик
← →
Cosmic (2003-01-24 10:48) [9]Это как? В смысле, как "не вызывать"?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.03.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c