- •Московский институт электронной техники
- •Программа
- •Контекст устройства
- •Драйвер устройства
- •Устройство вывода
- •Получить контекст устройства
- •Пример программы построения графика в dos
- •Программирование графики в Windows.
- •Пример программы построения графика в Windows
- •Задание к выполнению лабораторной работы.
Пример программы построения графика в Windows
Приведем код программы строящей график функции . Пусть код программы находится в файлеGraphWin.cpp. Код этой программы мы создадим, внеся небольшие изменения в программуOnlyWinв файлеOnlyWin.cpp. Во-первых, нам понадобятся две дополнительные библиотеки стандартного языкаC++. В начале программы появится фрагмент кода.
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <math.h>
#include <stdio.h>
Далее, нам понадобится функция Line_OnPaint(), которая будет рисовать график. Поэтому изменится фрагмент кода, где перечисляются прототипы функций.
//прототипы функций
BOOL RegisterApp(HINSTANCE hInst);
HWND CreateApp(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Line_OnDestroy(HWND);
void Line_OnPaint(HWND);
Функция Line_OnPaint()будет вызываться, когда придет сообщениеWM_PAINT. Поэтому надо внести несколько строчек кода в функциюWndProc, которая обрабатывает сообщения. Теперь эта функция будет выглядеть следующим образом
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
Line_OnPaint(hwnd);
break;
case WM_DESTROY:
Line_OnDestroy(hwnd);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0L;
}
Наконец, в конец программы OnlyWinнадо добавить информацию о графике и дать определение функцииLine_OnPaint(hwnd). Во многом это будет похоже наDOSпрограммуGraphDos.cpp. Приведем код конца программы.
//размеры поля вывода в мировых координатах
double xLeft, xRight, yBottom, yTop;
//размеры поля вывода в экранных координатах
int nLeft, nRight, mBottom, mTop;
//переход от xк пикселюn
inline int xn(double x){
return (x - xLeft)/(xRight - xLeft)*(nRight - nLeft) + nLeft; }
//переход от yк пикселюm
inline int ym(double y){
return (y - yBottom)/(yTop - yBottom)*(mTop - mBottom) + mBottom; }
//функция обрабатывающая сообщение WM_PAINT
void Line_OnPaint(HWND hwnd)
{
//размеры поля вывода в мировых и экранных координатах
xLeft = -2; xRight = 10; yBottom = -2; yTop = 2;
nLeft = 100; nRight = 350; mBottom = 250; mTop = 50;
//создаем массивы точек для аргумента x и функции y=sin(x)
const int N = 50;
double corX[N], corY[N];
double x, y, dx = (xRight - xLeft)/(N-1);
for(int i=0; i<N; i++)
{
x = xLeft + dx*i; y = sin(x);
corX[i] = x; corY[i] = y;
}
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps); //получаем контекст устройства
HBRUSH hbrush;
HPEN hpen;
//определяем кисть: 1) стиль - сплошной
// 2) цвет закраски - синий
hbrush = CreateSolidBrush(RGB(0,0,200));
SelectBrush(hdc,hbrush); //выбираем кистьhbrush
//определяем перо: 1) стиль - сплошной
// 2) толщина линий - 3 пикселей
// 3) цвет линий - ярко-желтый
hpen = CreatePen(PS_SOLID,3,RGB(255,255,0));
SelectPen(hdc,hpen); //выбираем перо hpen
Rectangle(hdc,nLeft,mBottom,nRight,mTop);
//определяем перо: 1) стиль - сплошной
// 2) толщина линий - 1 пикселей
// 3) цвет линий - ярко-голубой
hpen = CreatePen(PS_SOLID,1,RGB(0,255,255));
SelectPen(hdc,hpen); //выбираем перо hpen
int nb, ne, mb, me;
nb = xn(xLeft); mb = ym(0);
MoveTo(hdc,nb,mb);
ne = xn(xRight); me = ym(0);
LineTo(hdc,ne,me);
nb = xn(0); mb = ym(yBottom);
MoveTo(hdc,nb,mb);
ne = xn(0); me = ym(yTop);
LineTo(hdc,ne,me);
//название графика и осей
SetTextColor(hdc,RGB(255,255,255));
SetBkColor(hdc,RGB(0,0,200));
TextOut(hdc,(nLeft+nRight)/2-30, mTop+25, "Y = sin(X)",10);
SetBkColor(hdc,RGB(127,127,127));
TextOut(hdc,nLeft-35, (mBottom+mTop)/2, "Y",1);
TextOut(hdc,(nLeft+nRight)/2, mBottom+25, "X",1);
//выводи числа вдоль осей
char ss[10];
sprintf(ss,"%6.1lf",xLeft);
TextOut(hdc,nLeft-30,mBottom+7,ss,6);
sprintf(ss,"%6.1lf",xRight);
TextOut(hdc,nRight-30,mBottom+7,ss,6);
sprintf(ss,"%6.1lf",yBottom);
TextOut(hdc,nLeft-55,mBottom-7,ss,6);
sprintf(ss,"%6.1lf",yTop);
TextOut(hdc,nLeft-55,mTop+3,ss,6);
//рисуем график по двум массивам
//определяем перо: 1) стиль - сплошной
// 2) толщина линий - 1 пикселей
// 3) цвет линий - ярко-красный
hpen = CreatePen(PS_SOLID,1,RGB(255,0,0));
SelectPen(hdc,hpen); //выбираем перо hpen
nb = xn(corX[0]); mb = ym(corY[0]);
MoveTo(hdc,nb,mb);
for( i=1; i<N; i++)
{
nb = xn(corX[i]); mb = ym(corY[i]);
LineTo(hdc,nb,mb);
}
DeletePen(hpen); //убираем перо hpen
DeleteBrush(hbrush); //убираем кисть hbrush
EndPaint(hwnd, &ps);//освобождаем контекст устройства
}
После компиляции и компоновки получаем исполняемый файл GraphWin.exe. Запускаем программу. На Рис.6 приведен результат работы программы.
Рис.6