Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Region Functions [D6, Win95/98]


Cosmic ©   (2003-01-21 21:11:00) 

Здравствуйте, мастера!

Вопрос такой: я знаю, что существуют функции создания и управления регионами,
но как их применять, честно говоря, не очень себе представляю. Как с ними работать?
Как создавать регионы и объединять их? Если не сложно, с примерами, плиз.

А нужно мне вот что: взять произвольную BMP-шку и создать окно, имеющее форму этой
BMP-шки (наподобие Автозапуска на CHIP-CD). Буду оч-ч-ень благодарен за примеры.

Заранее спасибо.


Cosmic   (2003-01-24 10:48:00) [1]

Это как? В смысле, как "не вызывать"?


MBo   (2003-01-24 10:28:00) [2]

вероятно, если PtInRegion, то не вызывать унаследованный обработчик


Cosmic   (2003-01-24 10:19:00) [3]

Отлично, спасибо. Еще вопрос: при перехвате WM_NCLBUTTONDOWN (то есть, если я хочу, чтобы форма двигалась, когда я ее хватаю мышкой за любое место) перемещается не регион, который мной создан, а весь контур формы. Можно ли этого избежать?


MBo   (2003-01-23 06:13:00) [4]

>Cosmic © (22.01.03 22:40)
Ошибка в том, что приемный регион в CombineRgn уже должен быть создан! Можно использовать один из исходных или создать еще один


Mihey   (2003-01-22 23:41:00) [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"шкой.


Юрий Зотов   (2003-01-22 23:26:00) [6]

http://www.delphikingdom.com/helloworld/samples_win.htm#link11

Проект-пример Cunnings.zip
(CreateXXXRgn, CombineRgn, SetWindowRgn и еще кое-что)


Cosmic   (2003-01-22 22:40:00) [7]

Я пишу примерно так:

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 09:39:00) [8]

Про регион из BMP - есть статья Антона Григорьева на "Королевстве Delphi" (www.delphikingdom.com)


Billy   (2003-01-22 03:30:00) [9]

Здесь, насколько мне известно, применяется такая тактика:
1) Создается прямоугольный регион (под размер рисунка).
Функция CreateRectRgn.
2) В цикле ищутся горизонтальные линии (прозрачного цвета)толщиной в 1 пиксель и создаются прямоугольные регионы под размер этих областей.
3) При помощи CombineRgn с параметром RGN_DIFF "вычитаем" из 1-го региона второй (из общего - тоненький)
4) Вызываем SetWindowRgn.
5) Балдеем! :-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо