JS+
Усиленный язык сценариев для Windows
с возможностью встраивания
в ваши приложения
О языке JS+ Справочник Скачать JS+ DLL
Контакты
СПРАВОЧНИК ПО ЯЗЫКУ JS+ Содержание

SetWindowRgn

- функция WinAPI
Функции WinAPI
Устанавливает границы окна по границам региона.
Синтаксис
function SetWindowRgn(
  hWnd,
  hRgn,
  Redraw
): Boolean;

Параметры
Параметр Тип Описание
hWnd Number дескриптор окна
hRgn Number дескриптор региона
Redraw Boolean флаг последующей перерисовки окна
Возвращаемое значение
true в случае успеха или false в противном случае.
Пример 1 (JS+)
// Окно с закругленными углами и внутренними вырезами
// сложной формы, перемещаемое мышью

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;
}
Пример 2 (JS+)
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+Руководство пользователя
Адрес этой страницы: http://jsplus.ru/MANUAL/JSPlus/WinAPI/Function/SetWindowRgn.htm
© 2024,