Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Labs 2004 / Lab1 / LABOR_1.DOC
Скачиваний:
28
Добавлен:
16.04.2013
Размер:
390.66 Кб
Скачать

Пример программы построения графика в 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

Соседние файлы в папке Lab1
  • #
    16.04.20135.53 Кб23EGAVGA.BGI
  • #
    16.04.201344.81 Кб23GRAPHDOS.EXE
  • #
    16.04.201327.66 Кб24GRAPHWIN.EXE
  • #
    16.04.2013390.66 Кб28LABOR_1.DOC
  • #
    16.04.201311.9 Кб24ONLYWIN.EXE
  • #
    16.04.2013128 б25Readme.txt