(*~\Глагол\ПриложенияГОС\Заграница\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                         ОТДЕЛ Окно+;
(*============================================================================*)
(* НАЗНАЧЕНИЕ: вывод фразы "Открытое окно" через графическую оконную систему  *)
(*============================================================================*)

ИСПОЛЬЗУЕТ
  ОБХОД
        ;   (* Win API *)
ВИД
  ATOM    = ОБХОД.Цел16;
  WINBOOL = ЦЕЛ;
  LONG    = ЦЕЛ;
  DWORD   = ЦЕЛ;
  LONG_PTR= ЦЕЛ;
  LPARAM  = LONG_PTR;
  WPARAM  = LONG_PTR;
  LRESULT = LONG_PTR;
  UINT    = ЦЕЛ;
  HANDLE  = ЦЕЛ;
  HMODULE = HANDLE;
  HGDIOBJ = HANDLE;
  HINST   = HANDLE;
  HWND    = HANDLE;
  HDC     = HANDLE;
  HMENU   = HANDLE;
  HICON   = HANDLE;
  HCURSOR = HANDLE;
  HBRUSH  = HANDLE;
  LPCTSTR = ЦЕЛ;
  LPVOID  = ЦЕЛ;
  LPBYTE  = ЦЕЛ;
  LPCSTR  = ЦЕЛ;
  LPTSTR  = ЦЕЛ;
  WNDPROC = ЗАДАЧА* (_para1:HWND; _para2:UINT; _para3:WPARAM; _para4:LPARAM):LRESULT;
  STARTUPINFO = НАБОР
     cb           :DWORD;
     lpReserved   :LPTSTR;
     lpDesktop    :LPTSTR;
     lpTitle      :LPTSTR;
     dwX          :DWORD;
     dwY          :DWORD;
     dwXSize      :DWORD;
     dwYSize      :DWORD;
     dwXCountChars:DWORD;
     dwYCountChars:DWORD;
     dwFillAttribute:DWORD;
     dwFlags      :DWORD;
     wShowWindow  :ОБХОД.Цел16;
     cbReserved2  :ОБХОД.Цел16;
     lpReserved2  :LPBYTE;
     hStdInput    :HANDLE;
     hStdOutput   :HANDLE;
     hStdError    :HANDLE;
  КОН;
  POINT = НАБОР
     x:LONG;
     y:LONG;
  КОН;
  RECT = НАБОР
    Left,Top,Right,Bottom:ЦЕЛ;
  КОН;
  MSG = НАБОР
     hwnd   :HWND;
     message:UINT;
     wParam :WPARAM;
     lParam :LPARAM;
     time   :DWORD;
     pt     :POINT;
  КОН;
  PAINTSTRUCT = НАБОР
     hdc        :HDC;
     fErase     :WINBOOL;
     rcPaint    :RECT;
     fRestore   :WINBOOL;
     fIncUpdate :WINBOOL;
     rgbReserved:РЯД 32 ИЗ УЗКЦЕЛ;
  КОН;
  WNDCLASS = НАБОР
     style        :UINT;
     lpfnWndProc  :WNDPROC;
     cbClsExtra   :ЦЕЛ;
     cbWndExtra   :ЦЕЛ;
     hInstance    :HANDLE;
     hIcon        :HICON;
     hCursor      :HCURSOR;
     hbrBackground:HBRUSH;
     lpszMenuName :LPCTSTR;
     lpszClassName:LPCTSTR;
  КОН;

ПОСТ
  WM_PAINT            = 15;
  WM_DESTROY          = 2;
  DT_CENTER           = 1;
  DT_SINGLELINE       = 32;
  DT_VCENTER          = 4;
  CS_VREDRAW          = 1;
  CS_HREDRAW          = 2;
  IDC_ARROW           = 32512; 
  IDI_APPLICATION     = 32512;
  WHITE_BRUSH         = 0;
  WS_OVERLAPPEDWINDOW = 0CF0000H;
  CW_USEDEFAULT       = МИН(ЦЕЛ);
  SW_SHOW             = 5;
  MB_OK               = 0;

    (* начало графического приложения Окно, всё как в Windows *)  
ПОСТ
  имяПриложения="Глагол-приложение и вывод DrawText(hdc,'Открытое окно и Привѣтъ, мiръ!'...)";

ПЕР
  CmdShow:ЦЕЛ;
  hInstance:HANDLE;

ЗАДАЧА GetModuleHandle(lpModuleName:LPCSTR):HMODULE;    ВЫЗОВ "GetModuleHandleW"  ИЗ "kernel32.dll";
ЗАДАЧА GetStartupInfo(lpStartupInfo+:STARTUPINFO);      ВЫЗОВ "GetStartupInfoW"   ИЗ "kernel32.dll";
ЗАДАЧА GetStockObject(_para1:ЦЕЛ):HGDIOBJ;              ВЫЗОВ "GetStockObject"    ИЗ "gdi32.dll";
ЗАДАЧА BeginPaint(hWnd:HWND; lpPaint+:PAINTSTRUCT):HDC; ВЫЗОВ "BeginPaint"        ИЗ "user32.dll";
ЗАДАЧА GetClientRect(hWnd:HWND; lpRect+:RECT);          ВЫЗОВ "GetClientRect"     ИЗ "user32.dll";
ЗАДАЧА EndPaint(hWnd:HWND; lpPaint+:PAINTSTRUCT);       ВЫЗОВ "EndPaint"          ИЗ "user32.dll";
ЗАДАЧА PostQuitMessage(nExitCode:ЦЕЛ);                  ВЫЗОВ "PostQuitMessage"   ИЗ "user32.dll";
ЗАДАЧА LoadIcon(hInstance:HINST; lpIconName:ЦЕЛ):HICON; ВЫЗОВ "LoadIconW"         ИЗ "user32.dll";
ЗАДАЧА LoadCursor(hInstance:HINST; lpCursorName:ЦЕЛ):HCURSOR; ВЫЗОВ "LoadCursorW" ИЗ "user32.dll";
ЗАДАЧА RegisterClass(lpWndClass+:WNDCLASS):КЛЮЧ;        ВЫЗОВ "RegisterClassW"    ИЗ "user32.dll";
ЗАДАЧА ShowWindow(hWnd:HWND; nCmdShow:ЦЕЛ);             ВЫЗОВ "ShowWindow"        ИЗ "user32.dll";
ЗАДАЧА UpdateWindow(hWnd:HWND);                         ВЫЗОВ "UpdateWindow"      ИЗ "user32.dll";
ЗАДАЧА TranslateMessage(lpMsg+:MSG);                    ВЫЗОВ "TranslateMessage"  ИЗ "user32.dll";
ЗАДАЧА DispatchMessage(lpMsg+:MSG);                     ВЫЗОВ "DispatchMessageW"  ИЗ "user32.dll";
ЗАДАЧА CreateWindowEx(dwExStyle:DWORD; lpClassName-:ЦЕПЬ; lpWindowName-:ЦЕПЬ; dwStyle:DWORD; X,Y,nWidth,nHeight:ЦЕЛ; hWndParent:HWND; hMenu:HMENU; hInstance:HINST; lpParam:LPVOID):HWND; ВЫЗОВ "CreateWindowExW" ИЗ "user32.dll";
ЗАДАЧА MessageBox(hWnd:HWND; lpText-:ЦЕПЬ; lpCaption-:ЦЕПЬ; uType:UINT); ВЫЗОВ "MessageBoxW" ИЗ "user32.dll";
ЗАДАЧА GetMessage(lpMsg+:MSG; hWnd:HWND; wMsgFilterMin:UINT; wMsgFilterMax:UINT):КЛЮЧ; ВЫЗОВ "GetMessageW" ИЗ "user32.dll";
ЗАДАЧА DefWindowProc(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM):LRESULT; ВЫЗОВ "DefWindowProcW" ИЗ "user32.dll";
ЗАДАЧА DrawText(hDC:HDC; lpString-:ЦЕПЬ; nCount:ЦЕЛ; lpRect+:RECT; uFormat:UINT); ВЫЗОВ "DrawTextW" ИЗ "user32.dll";

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА*                                                   (* Вызывается из ОС *)
        ОконнаяЗадача(   hwnd:HWND;
                      message:UINT;
                       wParam:WPARAM;
                       lParam:LPARAM):LRESULT;
ПЕР
  hdc:HDC;
  paintStruct:PAINTSTRUCT;
  rect:RECT;
УКАЗ
  ВЫБРАТЬ message ИЗ
  | WM_PAINT:
      hdc:=BeginPaint(hwnd,paintStruct);
      GetClientRect(hwnd,rect);
      DrawText(hdc,"Открытое окно и Привѣтъ, мiръ!",-1,rect,DT_SINGLELINE+DT_CENTER+DT_VCENTER);
      EndPaint(hwnd,paintStruct)
  | WM_DESTROY:
      PostQuitMessage(0)
  ИНАЧЕ
    ВОЗВРАТ DefWindowProc(hwnd,message,wParam,lParam)
  КОН;
  ВОЗВРАТ 0
КОН ОконнаяЗадача;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ПрописатьОкно():КЛЮЧ;                         (* Прописывает окно в ОС *)
ПЕР
  wndClass:WNDCLASS;
УКАЗ
  wndClass.style:=CS_HREDRAW+CS_VREDRAW;
  wndClass.lpfnWndProc:=ОконнаяЗадача;
  wndClass.cbClsExtra:=0;
  wndClass.cbWndExtra:=0;
  wndClass.hInstance:=hInstance;
  wndClass.hIcon:=LoadIcon(0,IDI_APPLICATION);
  wndClass.hCursor:=LoadCursor(0,IDC_ARROW);
  wndClass.hbrBackground:=GetStockObject(WHITE_BRUSH);
  wndClass.lpszMenuName:=0;
  wndClass.lpszClassName:=ОБХОД.ПолучитьАдрес(имяПриложения);
  ВОЗВРАТ RegisterClass(wndClass)
КОН ПрописатьОкно;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СоздатьОкно():HWND;                   (* Создаёт оконный класс в Win32 *)
ПЕР
  hwnd:HWND;
УКАЗ
  hwnd:=CreateWindowEx(0,
                       имяПриложения,
                       имяПриложения,
                       WS_OVERLAPPEDWINDOW,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       CW_USEDEFAULT,
                       0,0,
                      hInstance,
                       0);
  ЕСЛИ hwnd # 0 ТО
      ShowWindow(hwnd,CmdShow);
    UpdateWindow(hwnd)
  КОН;
  ВОЗВРАТ hwnd
КОН СоздатьОкно;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Работа;
ПЕР
          msg:MSG;
  startupInfo:STARTUPINFO;
УКАЗ
  hInstance:=GetModuleHandle(0);
  GetStartupInfo(startupInfo);
  CmdShow:=startupInfo.wShowWindow;
  ЕСЛИ
       НЕ ПрописатьОкно()
  ТО
    MessageBox(0,"отказ в ПрописатьОкно","",MB_OK);
    ВОЗВРАТ
  КОН;
  ЕСЛИ
       СоздатьОкно() = 0
  ТО
    MessageBox(0,"отказ в СоздатьОкно","",MB_OK);
    ВОЗВРАТ
  КОН;
                                           (* получение и обработка сообщений *)
  ПОКА GetMessage(msg,0,0,0) ВЫП
    TranslateMessage(msg);
    DispatchMessage(msg)
  КОН
КОН Работа;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Работа
КОН Окно.
