Графические средства
Пример 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

