Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ИГС / IGS_lab1_1 / IGS_lab1_1 / IGS_lab1_1
.cpp
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h"
//прототип функции окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Line_OnPaint(HWND);
void Polygon_OnDC(HWND);
void Ellipse_OnDC(HWND);
int WINAPI WinMain(HINSTANCE hInstance, //идентификатор приложения
HINSTANCE hPrevInstance,
LPSTR lpCmdParam,
int nCmdShow)
{
WCHAR cname[] = L"Class"; // Имя класса окна
WCHAR title[] = L"Hello API Windows"; // Заголовок окна
MSG msg; // структура для работы с сообщениями
//регистрация класса окна приложения
//------------------------------------------------------------------------
WNDCLASS wc; // структура для регистрации класса окна приложения
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)WndProc; //адрес функции окна
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; //идентификатор приложения
wc.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wc.lpszMenuName = (LPCTSTR)IDR_MENU1;
wc.lpszClassName = cname;
if(!RegisterClass(&wc)) //регистрация класса окна приложения
return 0;
//создание окна приложения
//------------------------------------------------------------------------
HWND hWnd; // дескриптор окна приложения
hWnd = CreateWindow(cname,
title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, //идентификатор окна-родителя
NULL, //идентификатор меню
hInstance, //идентификатор приложения
NULL);
if(!hWnd)
return 0;
// Рисуем окно. Для этого после функции ShowWindow,
// рисующей окно, вызываем функцию UpdateWindows,
// посылающую сообщение WM_PAINT в функцию окна
//--------------------------------------------------------------------------
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
// Запускаем цикл обработки сообщений
//-------------------------------------------------------------------------
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//функция окна, обрабатывающая сообщения
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
//сообщение при закрытии окна
case WM_DESTROY:
PostQuitMessage(0); //выход из цикла сообщений
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_EXITE:
PostQuitMessage(0);
break;
case ID_CLEAN:
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_ELLIPS:
Ellipse_OnDC(hWnd);
break;
case ID_POLYGON:
Polygon_OnDC(hWnd);
break;
case ID_FUNCTIONS:
Line_OnPaint(hWnd);
}
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
//размеры окна вывода в мировой системе координат
double xLeft, xRight, yBottom, yTop;
//размеры окна вывода в пикселях на экране монитора
int nLeft, nRight, mBottom, mTop;
//переход от x к пикселю n
inline int xn(double x)
{
return (int)((x - xLeft) / (xRight - xLeft)*(nRight - nLeft)) + nLeft;
}
//переход от y к пикселю m
inline int ym(double y)
{
return (int)((y - yBottom) / (yTop - yBottom)*(mTop - mBottom)) + mBottom;
}
//функция обрабатывающая сообщение WM_PAINT
void Line_OnPaint(HWND hwnd)
{
//размеры окна в мировых координатах и в пикселях
xLeft = -2; xRight = 2; yBottom = -2; yTop = 2;
nLeft = 70; nRight = 450; mBottom = 450; mTop = 70;
//создаем массивы точек для аргумента x и функции y = sin(x)
const int N = 50;
double corX[N], corY[N], corY2[N], corX2[N];
double x, y, x2, y2, dx = (xRight - xLeft) / (N - 1);
for (int i = 0; i<N; i++)
{
x = yTop*(-1) + dx*i; y = abs(x);
x2 = yTop*(-1) + dx*i; y2 = (2 - x2*x2);
corX2[i] = x2; corY2[i] = y2;
corX[i] = x; corY[i] = y;
}
HDC hdc; //идентификтор контекста устройства
PAINTSTRUCT ps; //структура для работы контеста
hdc = GetDC(hwnd); //получаем контекст устройства <hdc> для окна <hwnd>
HBRUSH hbrush, hbrushOld; //идентификаторы кистей
HPEN hpen1, hpen2, hpen3, hpenOld; //идентификаторы перьев
//создаем кисть <hbrush1>, стиль - сплошной, цвет - white
hbrush = CreateSolidBrush(RGB(255, 255, 255));
//выбираем кисть <hbrush> в контекст устройства <hdc>,
//запоминаем идентификтор старой кисти <hbrushOld>
hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);
//создаем перо <hpen1>, стиль - сплошной, толщина 3 пиксела, цвет - черный
hpen1 = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
//выбираем перо <hpen1> в контекст устройства <hdc>,
//запоминаем идентификтор старого пера <hpenOld>
hpenOld = (HPEN)SelectObject(hdc, hpen1);
Rectangle(hdc, nLeft, mBottom, nRight, mTop);
//создаем перо <hpen2>, стиль - сплошной, толщина 1 пиксел, цвет - ярко-голубой
hpen2 = CreatePen(PS_SOLID, 1, RGB(153, 153, 153));
SelectObject(hdc, hpen2); //выбираем перо <hpen2> в контекст устройства <hdc>
int nb, ne, mb, me;
POINT pt;
//рисуем ось OX
nb = xn(xLeft); mb = ym(0);
MoveToEx(hdc, nb, mb, &pt);
ne = xn(xRight); me = ym(0);
LineTo(hdc, ne, me);
//рисуем ось OY
nb = xn(0); mb = ym(yBottom);
MoveToEx(hdc, nb, mb, &pt);
ne = xn(0); me = ym(yTop);
LineTo(hdc, ne, me);
//название графика и осей
SetTextColor(hdc, RGB(255, 255, 255));
SetBkColor(hdc, RGB(127, 127, 127));
TextOut(hdc, nLeft - 35, (mBottom + mTop) / 2, _T("Y"), 1);
TextOut(hdc, (nLeft + nRight) / 2, mBottom + 25, _T("X"), 1);
//выводим числа вдоль осей
TCHAR ss[10];
swprintf_s(ss, 10, L"%6.1lf", xLeft);
TextOut(hdc, nLeft - 15, mBottom + 3, ss, 6);
swprintf_s(ss, 10, L"%6.1lf", xRight);
TextOut(hdc, nRight - 30, mBottom + 7, ss, 6);
swprintf_s(ss, 10, L"%6.1lf", yBottom);
TextOut(hdc, nLeft - 55, mBottom - 7, ss, 6);
swprintf_s(ss, 10, L"%6.1lf", yTop);
TextOut(hdc, nLeft - 55, mTop + 3, ss, 6);
//рисуем график по двум массивам
//создаем перо <hpen3>, стиль - сплошной, толщина 2 пиксел, цвет - ярко-красный
hpen3 = CreatePen(PS_SOLID, 2, RGB(66, 170, 255));
SelectObject(hdc, hpen3); //выбираем перо <hpen3> в контекст устройства <hdc>
//y = abs(x)
nb = xn(corX[0]); mb = ym(corY[0]);
MoveToEx(hdc, nb, mb, &pt);
for (int i = 1; i<N; i++)
{
nb = xn(corX[i]); mb = ym(corY[i]);
LineTo(hdc, nb, mb);
}
HPEN hpen4 = CreatePen(PS_SOLID, 2, RGB(20, 70, 163));
SelectObject(hdc, hpen4);
//y=2-x^2
nb = xn(corX2[0]); mb = ym(corY2[0]);
MoveToEx(hdc, nb, mb, &pt);
for (int i = 1; i<N; i++)
{
nb = xn(corX2[i]); mb = ym(corY2[i]);
LineTo(hdc, nb, mb);
}
SelectObject(hdc, hbrushOld); //выбираем старую кисть <hbrushOld> в контекст устройства <hdc>
DeleteObject(hbrush); //уничтожаем кисть <hbrush>
SelectObject(hdc, hpenOld); //выбираем старое перо <hpenOld> в контекст устройства <hdc>
DeleteObject(hpen1); //уничтожаем перо <hpen1>
DeleteObject(hpen2); //уничтожаем перо <hpen2>
DeleteObject(hpen3); //уничтожаем перо <hpen3>
ReleaseDC(hwnd, hdc); //освобождаем контекст устройства <hdc> в окне <hwnd>
}
struct POINT2 {
double x, y;
};
void Polygon_OnDC(HWND hwnd)
{
RECT rc;
GetClientRect(hwnd, &rc); //дает размеры клиентской области окна <hwnd>
//размеры окна в мировых координатах и в пикселях
xLeft = -10; xRight = 10; yBottom = -6; yTop = 6;
nLeft = rc.left; nRight = rc.right; mBottom = rc.bottom; mTop = rc.top;
double masht; //коэффициент угловой деформации при переходе
//от мировых к экранным координатам
masht = (xRight - xLeft)*(mBottom - mTop) / (yTop - yBottom) / (nRight - nLeft);
HDC hdc;
hdc = GetDC(hwnd);
HBRUSH hbrush, hbrushOld;
HPEN hpen1, hpen2, hpenOld;
hpen1 = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
hpenOld = (HPEN)SelectObject(hdc, hpen1);
int nb, ne, mb, me;
//рисуем ось OX
nb = xn(xLeft); mb = ym(0);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(xRight); me = ym(0);
LineTo(hdc, ne, me);
//рисуем ось OY
nb = xn(0); mb = ym(yBottom);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(0); me = ym(yTop);
LineTo(hdc, ne, me);
const int PN = 8;
POINT2 Vt[PN];
Vt[0].x = 0; Vt[0].y = 3;
Vt[1].x = 2; Vt[1].y = 2;
Vt[2].x = 3; Vt[2].y = 0;
Vt[3].x = 2; Vt[3].y = -2;
Vt[4].x = 0; Vt[4].y = -3;
Vt[5].x = -2; Vt[5].y = -2;
Vt[6].x = -3; Vt[6].y = 0;
Vt[7].x = -2.1; Vt[7].y = 2.1;
POINT P[PN];
for (int i = 0; i<PN; i++)
{
P[i].x = xn(Vt[i].x); P[i].y = ym(Vt[i].y);
}
hpen2 = CreatePen(PS_SOLID, 2, RGB(192, 192, 192));
SelectObject(hdc, hpen2);
hbrush = CreateSolidBrush(RGB(255, 143, 162));
hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);
Polygon(hdc, P, PN);
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush);
SelectObject(hdc, hpenOld);
DeleteObject(hpen1);
DeleteObject(hpen2);
LOGFONT lf;
HFONT hFont, hFontOld;
double dx, dy, alf;
for (int j = 0; j < 7; j++)
{
dx = Vt[j + 1].x - Vt[j].x;
dy = Vt[j + 1].y - Vt[j].y;
alf = atan2(dy*masht, dx);
memset(&lf, 0, sizeof(LOGFONT));
wcscpy_s(lf.lfFaceName, L"Courier New");
lf.lfHeight = 18;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = LONG(573 * alf);
hFont = CreateFontIndirect(&lf);
if (j == 0)
hFontOld = (HFONT)SelectObject(hdc, hFont);
else
SelectObject(hdc, hFont);
SetBkColor(hdc, RGB(192, 192, 192));
SetTextColor(hdc, RGB(255, 255, 255));
TextOut(hdc, xn(Vt[j].x - 1.25*sin(alf)),
ym(Vt[j].y + 1.25*cos(alf)), _T(" Polygon "), 9);
}
SelectObject(hdc, hFontOld);
DeleteObject(hFont);
ReleaseDC(hwnd, hdc);
}
void Ellipse_OnDC(HWND hwnd)
{
RECT rc;
GetClientRect(hwnd, &rc); //дает размеры клиентской области окна <hwnd>
//размеры окна в мировых координатах и в пикселях
xLeft = -10; xRight = 10; yBottom = -6; yTop = 6;
nLeft = (5 * rc.left + rc.right) / 6;
nRight = (5 * rc.right + rc.left) / 6;
mBottom = (7 * rc.bottom + rc.top) / 8;
mTop = (7 * rc.top + rc.bottom) / 8;
HDC hdc = GetDC(hwnd);
//создание прямоугольной области поля вывода
HRGN hrgn1 = CreateRectRgn(nLeft, mTop, nRight, mBottom);
//заливаем выделенную область белым цветом
HBRUSH hbrush1 = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF));
FillRgn(hdc, hrgn1, hbrush1);
//ограничиваем область вывода изображения
//SelectClipRgn(hdc, hrgn1);
LOGFONT lf;
HFONT hFont1, hFontOld;
//создаем шрифт, выбираем его в контекст устройства и рисуем надпись
memset(&lf, 0, sizeof(LOGFONT));
strcpy((char *)lf.lfFaceName, "Arial");
lf.lfHeight = 30;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = 450;
hFont1 = CreateFontIndirect(&lf);
hFontOld = (HFONT)SelectObject(hdc, hFont1);
TextOut(hdc, xn(-3), ym(0), _T("E l l i p s e"), 15);
HPEN hpen1, hpenOld;
hpen1 = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
hpenOld = (HPEN)SelectObject(hdc, hpen1);
int nb, ne, mb, me;
//рисуем ось OX
nb = xn(xLeft); mb = ym(0);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(xRight); me = ym(0);
LineTo(hdc, ne, me);
//рисуем ось OY
nb = xn(0); mb = ym(yBottom);
MoveToEx(hdc, nb, mb, NULL);
ne = xn(0); me = ym(yTop);
LineTo(hdc, ne, me);
//размеры эллипса
double x1 = -8, x2 = 8, y1 = 4, y2 = -4;
double xSt = 4, ySt = -3;
double xEn = 4, yEn = 3;
HPEN hpen2 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
SelectObject(hdc, hpen2);
HBRUSH hbrush2, hbrushOld;
hbrush2 = CreateSolidBrush(RGB(0, 200, 255));
hbrushOld = (HBRUSH)SelectObject(hdc, hbrush2);
Pie(hdc, xn(x1), ym(y1), xn(x2), ym(y2), xn(xSt), ym(ySt), xn(xEn), ym(yEn));
//восстанавливаем контекст по умолчанию и уничтожаем созданные GDI-объекты
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush1);
DeleteObject(hbrush2);
SelectObject(hdc, hpenOld);
DeleteObject(hpen1);
DeleteObject(hpen2);
SelectObject(hdc, hFontOld);
DeleteObject(hFont1);
DeleteObject(hrgn1);
ReleaseDC(hwnd, hdc);
}
Соседние файлы в папке IGS_lab1_1