Графические средства
Пример Standard Graphics (1)
program picture ! Графический сборник use ifqwin type(xycoord) pt(3) integer(2) ires2 integer(1) :: mask(8)=[B'00000000', & B'00000000', & B'00111100', & B'00111100', & B'00111100', & B'00111100', & B'00000000', & B'00000000'] ires2 = setcolor(9) ires2 = ellipse($GBORDER,70,70,230,230) ! окружность pt(1).xcoord = 450; pt(1).ycoord = 10 ! треугольник pt(2).xcoord = 320; pt(2).ycoord = 120 pt(3).xcoord = 600; pt(3).ycoord = 300
Пример Standard Graphics (2)
ires2 = Polygon($GBORDER,pt,3) ires2 = Rectangle($GBORDER,150,10,400,260)! прямоугольник call SetFillMask(mask) ires2 = FloodFill(320,240,9) ! замкнутая область ires4 = SaveImage("D:\1.bmp",1,1,400,300) ! сохранение end
Используем GDI
GDI (Graphics Device Interface) подсистема Windows, отвечающая за вывод графики и текста.
Работа с GDI аналогична работе с процедурами Standard Graphics.
GDI предоставляет в разы больше возможностей.
Контекст устройства
Контекст устройства DC (Device Context) – структура данных, содержащая параметры и атрибуты вывода графики на устройство.
5 типов контекста устройства:
- дисплей (Display DC);
- принтер (Printer DC);
- память (Memory DC);
- метафайл (Metafile DC);
- информационный (Information DC).
Графические объекты
- перо (pen) вывод линий (цвет, толщина, стиль);
- кисть (brush) закраски фигур (цвет, стиль);
- шрифт (font) свойства шрифта, для вывода текста;
- палитра (palette) набор используемых в DC цветов;
- область (region) задает области отсечения (clipping regions), вне которых вывод графики блокируется.
Работа с дескрипторами
Работа с графическими объектами при помощи деcкрипторов (handles).
...
Создание и удаление объектов производится с помощью соответствующих функций.
Процедуры создания
Перо (карандаш)
hPen = CreatePen(STYLE, width, RGB(R,G,B)); STYLE : PS_SOLID – сплошная линия PS_DASH - штрихи PS_DOT - пунктир PS_DASHDOT – штрих пунтктир width – толщина, 0 – один пиксел R, G, B – интенсивность цвета 0..255
Кисть (заливка)
hBrush = CreateSolidBrush(RGB(R, G, B));
Процедуры рисования
ires = SetPixel(hdc,x,y,RGB(R, G, B))
ires = MoveToEx(hdc, x1, y1, NULL) ires = LineTo(hdc, x2, y2)
ires = Rectangle(hdc,x1,y1,x2,y2)
ires = Ellipse(hdc,x1,y1,x2,y2)
ires = Arc(hdc,x1,y1,x2,y2,x3,y3,x4,y4)
Сегмент эллипса
ires = Chord(hdc,x1,y1,x2,y2,x3,y3,x4,y4)
Сектор эллипса
ires = Pie(hdc,x1,y1,x2,y2,x3,y3,x4,y4)
Многоугольник
ires = Polygon(hdc,pt,N) type (point) pt поля x, y N – число вершин
Типы проектов для GDI
Отображение на экране, в памяти, метафайлах.
Модули ifwin, ifwina.
Создание оконного приложения.
Функции WinMain, WndProc.
Отсутствует возможность отображения на экране.
Модули ifwin, ifwina.
Без использования функций WinMain, WndProc.
Windowing Application
Функции WinMain и WndProc
WinMain выполняет:
- определение класса окна
- регистрация класса
- создание окна
- отображение окна
- запуск цикла обработки сообщений
MainWndProc обрабатывает поступающие сообщения
WM_CREATE WM_COMMAND WM_PAINT WM_CLOSE ...
WinMain (1)
use ifwin !********* основная программа ********* interface integer(4) FUNCTION WinMain(hInstance, hPrevInstance, & lpszCmdLine, nCmdShow) !MS$ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain integer(4) hInstance, hPrevInstance, lpszCmdLine, nCmdShow end function WinMain end interface end !--------- внешняя функция WinMain ------------ integer(4) FUNCTION WinMain(hInstance, hPrevInstance, & lpCmdLine, nCmdShow) !MS$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain use ifwina interface integer(4) function MainWndProc (hWnd, messsage, wParam, lParam) !MS$ ATTRIBUTES STDCALL, ALIAS : '_MainWndProc@16' :: MainWndProc integer hWnd, message, wParam, lParam end function MainWndProc end interface
WinMain (2)
!------------- формальные параметры -------------------- integer hInstance, hPrevInstance, lpCmdLine, nCmdShow !------------- внутренние константы/переменные --------- character(50) NameClass /"GDI"C/ character(100) NameMainWin /"Используем GDI"C/ logical bret integer iret, hWnd type (T_MSG) message type (T_WNDCLASS) wc if (hPrevInstance == 0) then call ZeroMemory (LOC(wc), sizeof(wc)) ! обнуление структуры wc.lpfnWndProc = LOC(MainWndProc) ! адрес оконной функции wc.hInstance = hInstance ! дескриптор данного приложения wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION)! значка wc.hCursor = LoadCursor(NULL, IDC_ARROW) ! курсора wc.hbrBackground = 6 ! цвет фона окна wc.lpszClassName = LOC(NameClass) ! имя класса окна if (RegisterClass (wc) == 0 ) then ! регистрация окна WinMain = FALSE return end if end if
WinMain (3)
hWnd = CreateWindow(NameClass, & ! имя класса окна NameMainWin, & ! имя окна INT(WS_OVERLAPPEDWINDOW),& ! стиль окна 0,0, & ! верхний левый угол 800,600, & ! размеры окна NULL, & ! дескриптор родительского окна NULL, & ! дескриптор главного меню hInstance, & ! дескриптор приложения NULL)! указатель на структуру с доп. инф. nCmdShow = SW_SHOWMAXIMIZED bret = ShowWindow(hWnd,nCmdShow) ! окно в развернутом виде bret = UpdateWindow(hWnd) ! перерисовка рабочей области do while (GetMessage(message, NULL, 0, 0)) ! обработка сообщений bret = TranslateMessage (message) iret = DispatchMessage (message) end do WinMain = message.wParam return end