Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИГС / IGS / Lab1 / Lab1 / WinMain

.cpp
Скачиваний:
2
Добавлен:
29.05.2018
Размер:
12.66 Кб
Скачать
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include <tchar.h>

#include "resource.h"

struct POINT2
{
	double x, y;
};


//прототип функции окна
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Ex1(HWND);
void Ex3(HWND hwnd);
void Ex2(HWND 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(WHITE_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,
	// вызываем функцию UpdateWindow,
	// и посылаем сообщение 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_PAINT:
			//Ex1(hWnd);    //наша функция рисования 
			break;
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				case ID_FILE_EXIT:
					PostQuitMessage(0);
					break;
				case ID_EX1:
					InvalidateRect(hWnd, NULL, TRUE);
					Ex1(hWnd);
					break;
				case ID_EX2:
					InvalidateRect(hWnd, NULL, TRUE);
					Ex2(hWnd);
					break;
				case ID_EX3:
					InvalidateRect(hWnd, NULL, TRUE);
					Ex3(hWnd);
					break;
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0); //выход из цикла сообщений
			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 Ex1(HWND hwnd)
{
	//размеры окна в мировых координатах и в пикселях
	xLeft = -2; xRight = 10; yBottom = -10; yTop = 10;
	nLeft = 100; nRight = 450; mBottom = 350; mTop = 50;

	//создаем массивы точек для аргумента x и функции y = sin(x)
	const int N = 5000;
	double corX1[N], corY1[N];
	double corX2[N], corY2[N];
	double x1, y1, dx1 = (xRight - xLeft) / (N - 1);
	double x2, y2, dx2 = (xRight - xLeft) / (N - 1);

	for (int i = 0; i < N; i++) {
		x1 = xLeft + dx1 * i; y1 = x1 * sin(x1);
		corX1[i] = x1; corY1[i] = y1;
	}

	for (int i = 0; i < N; i++) {
		x2 = xLeft + dx2 * i; y2 = (int) 1.0f / (x2 * x2 + 1);
		corX2[i] = x2; corY2[i] = y2;
	}

	HDC hdc; //идентификтор контекста устройства
	PAINTSTRUCT ps;  //структура для работы контеста    

	hdc = BeginPaint(hwnd, &ps); //получаем контекст <hdc> для окна <hwnd> 
	//hdc = GetDC(hwnd); //получаем контекст <hdc> для окна <hwnd> 

	HBRUSH hbrush, hbrushOld; //идентификаторы кистей
	HPEN hpen1, hpen2, hpen3, hpenOld; //идентификаторы перьев

	//создаем кисть <hbrush1>, стиль - сплошной, цвет - синий
	hbrush = CreateSolidBrush(RGB(0, 0, 200));
	//выбираем кисть <hbrush> в контекст устройства <hdc>, 
	//запоминаем идентификтор старой кисти <hbrushOld>
	hbrushOld = (HBRUSH) SelectObject(hdc, hbrush);

	//создаем перо <hpen1>, стиль сплошной, толщина 3 пикселя, цвет желтый
	hpen1 = CreatePen(PS_SOLID, 3, RGB(255, 255, 0));
	//выбираем перо <hpen1> в контекст устройства <hdc>,
	//запоминаем идентификтор старого пера <hpenOld>
	hpenOld = (HPEN) SelectObject(hdc, hpen1);

	Rectangle(hdc, nLeft, mBottom, nRight, mTop);

	//создаем перо <hpen2>, стиль сплошной, толщина 1 пиксел, цвет голубой
	hpen2 = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
	//выбираем перо <hpen2> в контекст устройства <hdc>
	SelectObject(hdc, hpen2);

	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 - 30, mBottom + 7, 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(255, 0, 0));
	//выбираем перо <hpen3> в контекст устройства <hdc>
	SelectObject(hdc, hpen3);

	nb = xn(corX1[0]);  mb = ym(corY1[0]);
	MoveToEx(hdc, nb, mb, &pt);
	for (int i = 1; i < N; i++) {
		nb = xn(corX1[i]);  mb = ym(corY1[i]);
		if ((mb <= mBottom) && (mb >= mTop))
			LineTo(hdc, nb, mb);
		else
			MoveToEx(hdc, nb, mb, &pt);
	}

	DeleteObject(hpen3);
	hpen3 = CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
	//выбираем перо <hpen3> в контекст устройства <hdc>
	SelectObject(hdc, hpen3);

	nb = xn(corX2[0]);  mb = ym(corY2[0]);
	MoveToEx(hdc, nb, mb, &pt);
	for (int i = 1; i < N; i++) {
		if (mb > mTop) {
			nb = xn(corX2[i]);  mb = ym(corY2[i]);
			LineTo(hdc, nb, mb);
		}
	}

	//выбираем старую кисть <hbrushOld> в контекст устройства <hdc>
	SelectObject(hdc, hbrushOld);
	DeleteObject(hbrush);        //уничтожаем кисть <hbrush>

	//выбираем старое перо <hpenOld> в контекст устройства <hdc>
	SelectObject(hdc, hpenOld);
	DeleteObject(hpen1);         //уничтожаем перо <hpen1>
	DeleteObject(hpen2);         //уничтожаем перо <hpen2>
	DeleteObject(hpen3);         //уничтожаем перо <hpen3>

	//освобождаем контекст устройства <hdc> в окне <hwnd>
	EndPaint(hwnd, &ps);
	//ReleaseDC(hwnd, hdc);
}

void Ex2(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);
	PAINTSTRUCT ps;
	HDC hdc = BeginPaint(hwnd, &ps);

	//создание прямоугольной области поля вывода
	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));
	wcscpy_s(lf.lfFaceName, L"Arial");

	lf.lfHeight = 45;
	lf.lfWeight = FW_BOLD;
	lf.lfEscapement = 900;

	hFont1 = CreateFontIndirect(&lf);
	hFontOld = (HFONT) SelectObject(hdc, hFont1);

	TextOut(hdc, xn(-5), ym(-2), _T(" E l l i p s e "), 15);

	HPEN hpen1, hpenOld;
	hpen1 = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
	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 = -7, x2 = 7, y1 = 4, y2 = -4, xSt = -1, ySt = -1, xEn = -1, yEn = 1;

	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);

	//Ellipse(hdc, xn(x1), ym(y1), xn(x2), ym(y2));
	Chord(hdc, xn(x1), ym(y1), xn(x2), ym(y2), xn(xEn), ym(yEn), xn(xSt), ym(ySt));

	//восстанавливаем контекст по умолчанию и уничтожаем созданные 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);
	EndPaint(hwnd, &ps);
}

void Ex3(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);
	PAINTSTRUCT ps;
	hdc = BeginPaint(hwnd, &ps);

	HBRUSH hbrush, hbrushOld;
	HPEN hpen1, hpen2, hpenOld;
	hpen1 = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
	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);

	POINT2 Vt[10];
	Vt[0].x = 0;  Vt[0].y = 4;
	Vt[1].x = 1;  Vt[1].y = 2;
	Vt[2].x = 3;  Vt[2].y = 2;
	Vt[3].x = 1;  Vt[3].y = 0;
	Vt[4].x = 2;  Vt[4].y = -3;
	Vt[5].x = 0;  Vt[5].y = -1;
	Vt[6].x = -2; Vt[6].y = -3;
	Vt[7].x = -1; Vt[7].y = 0;
	Vt[8].x = -3; Vt[8].y = 2;
	Vt[9].x = -1; Vt[9].y = 2;

	POINT P[10];
	for (int i = 0; i < 10; i++)
	{
		P[i].x = xn(Vt[i].x); P[i].y = ym(Vt[i].y);
	}

	hpen2 = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
	SelectObject(hdc, hpen2);

	hbrush = CreateSolidBrush(RGB(0, 200, 255));
	hbrushOld = (HBRUSH) SelectObject(hdc, hbrush);

	Polygon(hdc, P, 10);

	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 < 10; j++)
	{
		dx = ((j < 9) ? Vt[j + 1].x : Vt[0].x) - Vt[j].x;
		dy = ((j < 9) ? Vt[j + 1].y : Vt[0].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 - 0.25*sin(alf)),
			ym(Vt[j].y +0.25*cos(alf)), _T(" Polygon "), 9);
	}

	SelectObject(hdc, hFontOld);
	DeleteObject(hFont);
	//ReleaseDC(hwnd, hdc);
	EndPaint(hwnd, &ps);
}
Соседние файлы в папке Lab1
  • #
    29.05.20182.32 Кб2Lab1.aps
  • #
    29.05.20183.57 Кб2Lab1.rc
  • #
    29.05.20187.19 Кб2Lab1.vcxproj
  • #
    29.05.20181.34 Кб2Lab1.vcxproj.filters
  • #
    29.05.2018646 б2resource.h
  • #
    29.05.201812.66 Кб2WinMain.cpp