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

ИГС / IGS_lab1_1 / IGS_lab1_1 / IGS_lab1_1

.cpp
Скачиваний:
5
Добавлен:
17.04.2018
Размер:
12.43 Кб
Скачать

#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
  • #
    17.04.20181.44 Mб6Icon1.bmp
  • #
    17.04.201891.85 Кб5Icon2.bmp
  • #
    17.04.20182.4 Кб5IGS_lab1_1.aps
  • #
    17.04.201812.43 Кб5IGS_lab1_1.cpp
  • #
    17.04.20183.89 Кб5IGS_lab1_1.rc
  • #
    17.04.20183.76 Кб5IGS_lab1_1.vcxproj
  • #
    17.04.20181.43 Кб5IGS_lab1_1.vcxproj.filters
  • #
    17.04.2018223 б5IGS_lab1_1.vcxproj.user
  • #
    17.04.20181.85 Кб5resource.h