Код: Выделить всё
PROGRAM
MAP
Module('Windows')
DefWindowProc(UnSigned hWnd, UnSigned wMsg, UnSigned wParam, UnSigned lParam),Long,Pascal,Name('DefWindowProcA')
End
MyProcess
SubClassFunc(UnSigned hWnd, UnSigned wMsg, UnSigned wParam, UnSigned lParam),LONG,Pascal
END
INCLUDE('KEYCODES.CLW')
INCLUDE('CFCAPI.inc')
SavedWnd Group,Type
WndProc ULong
Thread ULong
End
CODE
MyProcess
MyProcess PROCEDURE
Win WINDOW('Datamart'),AT(,,395,224),FONT('MS Sans Serif',8,,FONT:regular),CENTER,IMM,ICON('actions.ico'),CENTERED,SYSTEM,GRAY,MAX,RESIZE
BUTTON('Закрыть приложение'),AT(15,14,107,43),USE(?Ex),KEY(AltX)
BUTTON('СКРЫТЬ'),AT(151,14,107,43),USE(?Hd),SKIP
END
sw Group(SavedWnd).
WS_EX_TOOLWINDOW EQUATE(80h)
HWND_TOPMOST EQUATE(-1)
SWP_NOSIZE Equate(01h)
SWP_NOMOVE Equate(02h)
SWP_NOACTIVATE Equate(10h)
Sized_First Byte(TRUE)
CODE
OPEN(Win)
Win{PROP:Hide} = TRUE
CFC_SetWindowLong( Win{PROP:Handle}, CFC_GWL_EXSTYLE, WS_EX_TOOLWINDOW )
sw.WndProc = Win{PROP:WndProc}
sw.Thread = Thread()
Win{PROP:WndProc} = Address(SubClassFunc)
CFC_SetWindowLong( Win{PROP:Handle}, CFC_GWL_USERDATA, Address(sw.WndProc) )
ACCEPT
Case EVENT()
Of EVENT:OpenWindow
Win{PROP:Timer} = 1000
OrOf Event:Iconize !пользователь нажал кнопку "свернуть" - IMM - для отлова этого события
OrOf EVENT:CloseWindow
Cycle
Of EVENT:Timer
Win{PROP:Text} = ''
Win{PROP:NoFrame} = TRUE
Win{PROP:Maximize} = TRUE
Win{Prop:Hide} = False
Win{Prop:Iconize}= False
Win{Prop:Active} = TRUE
Win{PROP:Timer} = 0
CFC_SetWindowPos(Win{PROP:Handle}, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE+SWP_NOSIZE+SWP_NOACTIVATE)
POST(EVENT:USER)
Of EVENT:Sized
If Sized_First Then
Clear(Sized_First); Cycle
End
OrOf EVENT:LoseFocus
OrOf EVENT:Suspend
OrOf EVENT:USER
CFC_SetForegroundWindow(Win{PROP:Handle}) !поставить на него фокус
CFC_SetActiveWindow(Win{PROP:Handle})
Of EVENT:CloseDown
Break
Of EVENT:ACCEPTED
case Accepted()
of ?Ex
Break
of ?Hd
Win{Prop:Hide} = TRUE
Win{PROP:Timer} = 1000
end
End !Case
END !ACCEPT
Close(Win)
RETURN
!----------------------------------------
SubClassFunc Function(UnSigned hWnd, UnSigned wMsg, UnSigned wParam, UnSigned lParam) !,LONG,Pascal
WM_QUERYENDSESSION EQUATE(011h) !запрос системы о согласии приложения завершиться
WM_ENDSESSION EQUATE(016h) !сообщение системы о своём завершении
WM_WINDOWPOSCHANGED EQUATE(047h) !изменение координат и других параметров окна
ret Long(0)
sw &SavedWnd
Code
sw &= CFC_GetWindowLong(hWnd, CFC_GWL_USERDATA)
Case wMsg
Of WM_QUERYENDSESSION
ret = 1 ! я согласен на завершение
Of WM_ENDSESSION
POST(EVENT:CloseDown,, sw.Thread)
! ret = 0 ! я получил извещение о завершении
Of WM_WINDOWPOSCHANGED
ret = DefWindowProc(hWnd, wMsg, wParam, lParam)
Else
ret = CFC_CallWindowProc(sw.WndProc, hWnd, wMsg, wParam, lParam)
End !Case
Return (ret)