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

WindowProc

- функция обратного вызова
Windows API
Оконная процедура Windows предназначена для перехвата и обработки оконных сообщений визуальных компонентов.
Синтаксис
function WindowProc(
  Sender,
  Msg,
  wParam,
  lParam
): Number;

Параметры
Параметр Тип Описание
Sender Number дескриптор визуального компонента
Msg Number идентификатор сообщения Windows
wParam Number параметр WPARAM сообщения Windows
lParam Number параметр LPARAM сообщения Windows
Пример 1 (JS+)
var tab=15,old_WndProc;
var pns=new TPaintStruct();

// Главная форма
frm=new TForm();
frm.Caption="JS+ - функция обратного вызова WindowProc";
frm.Width =450;
frm.Height=300;

old_WndProc=GetWindowLong(frm.Handle,GWL_WNDPROC);
frm.WindowProc=new_WndProc;

frm.ShowModal();

// Оконная процедура главной формы
function new_WndProc(Sender,Msg,wParam,lParam)
{
  var hDC;
  var hWnd=Sender.Handle;
  var out_str="Текст выведен функцией WinAPI TextOut";

  switch (Msg) {
    case WM_PAINT : hDC=GetDC(hWnd);
                     BeginPaint(hWnd,pns);
                     SetBkColor(hDC,clLtGray.toRGB());
                     TextOut(hDC,tab,tab,out_str,out_str.length);
                     EndPaint(hWnd,pns);
                     ReleaseDC(hWnd,hDC);
                     return 0;

    case WM_DESTROY: SetWindowLong(hWnd,GWL_WNDPROC,old_WndProc);
  }

  return CallWindowProc(old_WndProc,hWnd,Msg,wParam,lParam);
}
Пример 2 (JS+)
// Главная форма
frm=new TForm();
frm.Caption="JS+ - функция обратного вызова WindowProc";
frm.Width =600;
frm.Height=450;
frm.WindowProc=frm_WndProc;

// Строка состояния
stb=new TStatusBar(frm);
stb.SimpleText=" Немедленно закройте форму!";

frm.ShowModal();

// Оконная процедура главной формы
function frm_WndProc(Sender,Msg,wParam,lParam)
{
  var hWnd=Sender.Handle;

  switch (Msg) {
    case WM_CLOSE : alert("Осторожно, форма закрывается!");
                     break;

    case WM_DESTROY: SetWindowLong(hWnd,GWL_WNDPROC,Sender.OldWndProc);
  }

  return CallWindowProc(Sender.OldWndProc,hWnd,Msg,wParam,lParam);
}
Пример 3 (JS+)
// Структура PaintStruct для функций BeginPaint/EndPaint
var pns=new TPaintStruct();

// Форма без заголовка
frm=new TForm();
frm.BorderStyle=bsNone;
frm.Width =w1=GetSystemMetrics(SM_CXSCREEN)/3;
frm.Height=h1=GetSystemMetrics(SM_CYSCREEN)/3;
frm.Cursor=crHandPoint;
frm.OnMouseDown=frm_MouseDown;
frm.WindowProc=new_WndProc;

// Кисти
br1=CreateSolidBrush(0x005080.toTColor());
br2=CreateSolidBrush(0x004070.toTColor());

// Кнопка
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();

// Обработчик события OnClick кнопки "Закрыть"
function btn_Click(btn)
{
  frm.Close();
}

// Оконная процедура главной формы
function new_WndProc(Sender,Msg,wParam,lParam)
{
  var w2=w1-20,h2=h1-20;
  var hWnd=Sender.Handle;
  var owp=Sender.OldWndProc;

  switch (Msg) {
    case WM_PAINT:
         hDC=BeginPaint(hWnd,pns);

         // Прямоугольник с закругленными углами
         rgn1=CreateRoundRectRgn(0,0,w1,h1,40,40);

         // Эллипс внутри прямоугольника
         rgn2=CreateEllipticRgn(20,20,w2,h2);
         CombineRgn(rgn1,rgn1,rgn2,RGN_DIFF);

         FillRgn(hDC,rgn1,br1);
         FrameRgn(hDC,rgn1,br2,1,1);

         DeleteObject(rgn2);
         DeleteObject(rgn1);

         EndPaint(hWnd,pns);
         return 0;

    case WM_DESTROY:
         DeleteObject(br1);
         DeleteObject(br2);

         SetWindowLong(hWnd,GWL_WNDPROC,owp);
  }

  return CallWindowProc(owp,hWnd,Msg,wParam,lParam);
}

// Обработчик события OnMouseDown главной формы
function frm_MouseDown(frm,Button,Shift,X,Y)
{
  var crs=frm.Cursor;

  if (Button!=mbLeft)
    return;

  ReleaseCapture();
  frm.Cursor=crDrag;

  // Войти в процесс перемещения формы мышью
  frm.Perform(WM_SYSCOMMAND,0xF009,0);

  frm.Cursor=crs;
}
Примечание
WindowProc является функцией обратного вызова, т.е. вызывается системой Windows при наступлении соответствующего события.

В обработчике оконной процедуры выполняется вызов предыдущего обработчика, адрес которого можно получить двумя способами:

  • используя функцию WinAPI GetWindowLong (см. Пример 1);
  • используя свойство визуального компонента OldWndProc, которое становится доступным сразу после установки нового обработчика оконной процедуры (см. Пример 2).
Совместимость
JS+, Windows API
JS+Руководство пользователя
Адрес этой страницы: http://jsplus.ru/MANUAL/JSPlus/WinAPI/WinPrc.htm
© 2024,