Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 651 / 76 | Длительность: 06:01:00
Лекция 7:

Графические средства

Пример 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).

HDC, дескриптор контекста

HPEN, дескриптор пера

HBRUSH, дескриптор кисти

HFONT дескриптор шрифта

...

Создание и удаление объектов производится с помощью соответствующих функций.

Процедуры создания

Перо (карандаш)

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

Windowing Application

Отображение на экране, в памяти, метафайлах.

Модули ifwin, ifwina.

Создание оконного приложения.

Функции WinMain, WndProc.

Console Application

Отсутствует возможность отображения на экране.

Модули 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