|
Устанавливает границы окна по границам региона.
Синтаксис
function SetWindowRgn(
| hWnd, | hRgn, | Redraw
| ): Boolean;
|
Параметры
|
Параметр
| Тип
| Описание
|
hWnd
| Number
| дескриптор окна
|
hRgn
| Number
| дескриптор региона
|
Redraw
| Boolean
| флаг последующей перерисовки окна
|
|
Возвращаемое значение
true в случае успеха или false в противном случае.
// Окно с закругленными углами и внутренними вырезами // сложной формы, перемещаемое мышью
var clr=0x0070A0.toTColor();
// Форма без заголовка frm=new TForm(); frm.BorderStyle=bsNone; frm.Width =w1=GetSystemMetrics(SM_CXSCREEN)/2; frm.Height=h1=GetSystemMetrics(SM_CYSCREEN)/2; frm.Color=clr;
// Регион Прямоугольник с закругленными углами // по размеру формы rgn1=CreateRoundRectRgn(0,0,w1,h1,40,40);
// Регион Эллипс w2=w1-20; h2=h1-20; rgn2=CreateEllipticRgn(20,20,w2,h2);
// Регион Звезда h2=h2-20; x=x1=(w1-h2)/2; y=y1=(h1-h2)/2+15; pnt_lst=new Array(); for (i=0,n=5,h=h2/2,f=Math.PI*4/n;i<n;i++) pnt_lst[i]=new TPoint(x+h*(1+Math.sin(f*i)),y+h*(1-Math.cos(f*i))); rgn3=CreatePolygonRgn(pnt_lst,n,WINDING);
// Форма в виде прямоугольника с закругленными углами // с эллипсом и звездой CombineRgn(rgn1,rgn1,rgn2,RGN_DIFF); CombineRgn(rgn1,rgn1,rgn3,RGN_OR); SetWindowRgn(frm.Handle,rgn1,true);
DeleteObject(rgn2); DeleteObject(rgn3);
// Панель в виде звезды str=new TPanel(frm); str.Caption="Нажми меня!"; str.Font.color=clWhite; str.Width=str.Height=h2; str.Left=x1; str.Top =y1; str.Color=frm.Color; str.Cursor=crHandPoint; str.OnMouseDown=str_MouseDown; for (i=0;i<n;i++) { pnt_lst[i].x-=x; pnt_lst[i].y-=y; } rgn=CreatePolygonRgn(pnt_lst,n,WINDING); SetWindowRgn(str.Handle,rgn,true);
// Кнопка btn=new TButton(frm); btn.Caption="Закрыть"; btn.Left=frm.ClientWidth -btn.Width -20; btn.Top =frm.ClientHeight-btn.Height-20; btn.Hint="Закрыть окно"; btn.ShowHint=true; btn.OnClick=btn_Click;
frm.ShowModal();
// Получить цвет ярче/темнее function getShiftColor(clr,shift) { var c;
return RGB( ((c=getRValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c, ((c=getGValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c, ((c=getBValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c); }
// Обработчик события OnClick кнопки "Закрыть" function btn_Click(btn) { frm.Close(); }
// Обработчик события OnMouseDown панели str function str_MouseDown(str,Button,Shift,X,Y) { var clr=str.Color,crs=str.Cursor,cpt=str.Caption;
if (Button!=mbLeft) return;
ReleaseCapture(); str.Color=getShiftColor(clr,48); str.Cursor=crDrag; str.Caption="Двигай меня!";
// Войти в процесс перемещения формы мышью frm.Perform(WM_SYSCOMMAND,0xF009,0);
str.Caption=cpt; str.Cursor=crs; str.Color=clr; }
|
var Size=4,Size2=Size*Size; var Cell=new Array(); var Hole=new TPoint(Size-1,Size-1); var clWin=0xB00000.toTColor();
// Главная форма frm=new TForm(); frm.Caption="JS+ - функция WinAPI SetWindowRgn";
// Фоновая панель bkp=new TPanel(frm); bkp.BorderStyle=bsSingle; bkp.Left=bkp.Top=10; bkp.Font.Size+=2; bkp.Color=getShiftColor(frm.Color,-16);
// Игровое поле dx=dy=80;// Размер ячейки поля for (y=i=0,d1=5,d2=10,Rnd_List=new Array();y<Size;y++) { Cell[y]=new Array(); for (x=0;x<Size;x++,i++) { // Внешняя панель ячейки otp=new TPanel(bkp); otp.BevelOuter=bvRaised; otp.Left=x*dx+x; otp.Top =y*dy+y; otp.Width =dx; otp.Height=dy;
// Внутренняя панель ячейки inp=new TPanel(otp); inp.BevelOuter=bvLowered; inp.SetBounds(d1,d1,w=otp.ClientWidth-d1*2,h=otp.ClientHeight-d1*2);
// Выпуклый градиент на внутренней панели gr1=new TGradient(inp); gr1.Align=alClient; gr1.Style=gsDiagonalLF; gr1.ColorBegin=clWhite; gr1.ColorEnd=clLtGray;
// Панель под круглый регион crp=new TPanel(inp); crp.SetBounds(d2,d2,w-=d2*2,h-=d2*2);
// Круглый регион rgn=CreateEllipticRgn(0,0,w,h); SetWindowRgn(crp.Handle,rgn,true); DeleteObject(rgn);
// Вогнутый градиент на круглой панели gr2=new TGradient(crp); gr2.Align=alClient; gr2.Style=gsDiagonalLF; gr2.ColorBegin=gr1.ColorEnd; gr2.ColorEnd=gr1.ColorBegin;
// Метка на внутренней панели lbl=Cell[y][x]=new TLabel(crp); lbl.AutoSize=false; lbl.Align=alClient; lbl.Alignment=taCenter; lbl.Layout=tlCenter; lbl.cmpTag=new TPoint(x,y); lbl.Font.Size+=2; lbl.OnMouseEnter=lbl_MouseEnter; lbl.OnMouseLeave=lbl_MouseLeave; lbl.OnClick=lbl_Click;
if (i<(Size2-1)) { while ( inArray(Rnd_List,j=Math.round((Size2-2)*Math.random())+1) ); lbl.Caption=""+(Rnd_List[i]=j); } } } otp.Visible=false;
// Подогнать размер формы под размер игрового поля bkp.ClientWidth =dx*Size+(Size-1); bkp.ClientHeight=dy*Size+(Size-1); frm.ClientWidth =bkp.Width+bkp.Left*2; frm.ClientHeight=bkp.Height+bkp.Top*2;
frm.ShowModal();
// Получить цвет ярче/темнее function getShiftColor(clr,shift) { var c;
return RGB( ((c=getRValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c, ((c=getGValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c, ((c=getBValue(clr)+shift)>255) ? 255 : (c<0) ? 0 : c); }
// Проверка элемента на вхождение в массив function inArray(in_List,val) { for (i=0,n=in_List.length;i<n;i++) if (in_List[i]==val) return true;
return false; }
// Проверка ячейки на возможность перемещения function isMovable(pnt) { var x,y;
for (x=0,y=pnt.y;x<Size;x++) if ((x==Hole.x) && (y==Hole.y)) return "x";
for (y=0,x=pnt.x;y<Size;y++) if ((x==Hole.x) && (y==Hole.y)) return "y";
return ""; }
// Обработчик события OnClick function lbl_Click(lbl) { var i,x,y,d,n,ok,inp=lbl.Parent.Parent,pnt=lbl.cmpTag;
if (lbl.Cursor!=crHandPoint) return;
inp.Parent.Visible=false; lbl_MouseLeave(lbl);
switch (isMovable(pnt)) { case "x": d=(pnt.x>Hole.x) ? 1 : -1; for (x=Hole.x,y=pnt.y;x!=pnt.x;x+=d) Cell[y][x].Caption=Cell[y][x+d].Caption; break;
case "y": d=(pnt.y>Hole.y) ? 1 : -1; for (y=Hole.y,x=pnt.x;y!=pnt.y;y+=d) Cell[y][x].Caption=Cell[y+d][x].Caption; }
Cell[Hole.y][Hole.x].Parent.Parent.Parent.Visible=true; Hole.x=pnt.x; Hole.y=pnt.y;
// Окончание игры
for (y=0,i=1;y<Size;y++) { n=(y==(Size-1)) ? (Size2-2) : (Size2-1); for (x=0;(x<Size) && (i<n);x++,i++) if (parseInt(Cell[y][x].Caption)!=i) return; }
bkp.Enabled=false;
ok=(parseInt(Cell[y-1][x].Caption)==i) ? true : false; for (y=0;y<Size;y++) for (x=0;x<Size;x++) switch (ok) { case false: Cell[y][x].Font.Color=clGray; break; case true : Cell[y][x].Font.Color=clWin; } }
// Обработчик события OnMouseEnter function lbl_MouseEnter(lbl) { if (isMovable(lbl.cmpTag)=="") return;
lbl.Font.Color=clWin; lbl.Cursor=crHandPoint; }
// Обработчик события OnMouseLeave function lbl_MouseLeave(lbl) { var inp=lbl.Parent;
if (lbl.Cursor!=crHandPoint) return;
lbl.Font.Color=inp.Font.Color; lbl.Cursor=inp.Cursor; }
|
Примечание
При вызове функция посылает окну сообщения WM_WINDOWPOSCHANGING и WM_WINDOWPOSCHANGED. Координаты региона указываются относительно левого верхнего угла неклиентской области окна. Система
самостоятельно удаляет дескриптор региона, когда он больше не требуется.
Совместимость
Windows API
|
JS+ | Руководство пользователя
|
|
|