|
Оконная процедура Windows предназначена для перехвата и обработки оконных сообщений визуальных компонентов.
Синтаксис
function WindowProc(
| Sender, | Msg, | wParam, | lParam
| ): Number;
|
Параметры
|
Параметр
| Тип
| Описание
|
Sender
| Number
| дескриптор визуального компонента
|
Msg
| Number
| идентификатор сообщения Windows
|
wParam
| Number
| параметр WPARAM сообщения Windows
|
lParam
| Number
| параметр LPARAM сообщения Windows
|
|
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); }
|
// Главная форма 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); }
|
// Структура 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+ | Руководство пользователя
|
|
|