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