Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.17;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2003.03.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
8-54124
Сергей2002
2002-12-04 14:33
2003.03.17
Помогите, пожалуйста


1-54077
Neznaika
2003-03-05 11:15
2003.03.17
Exe & Stream


14-54285
Volly
2003-02-25 15:58
2003.03.17
Нужны бета-тестеры


3-53898
Ренат
2003-02-25 13:54
2003.03.17
Обновление VIEW в Interbase


14-54230
NicoLa__
2003-02-27 17:27
2003.03.17
Шкодинг и Гэйминг...