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

ИГС / Lab_02 / move09 / move09 / mov09

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


#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <math.h>
#include <stdio.h>

//идентификатор приложения
HINSTANCE hInstApp;
//идентификатор растрового изобоажения в ресурсе
HBITMAP TheBitmap;



//название программы
WCHAR const szClassName[] = TEXT("Movement");
//заголовок окна   
WCHAR const szWindowTitle[] = 
	TEXT("Korneev V.   Picture Field from bmp-file.  Move Wagon");


//прототимы функций
BOOL RegisterApp(HINSTANCE hInst);
HWND CreateApp(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Move_OnCreate();
void Move_OnDestroy(HWND hwnd);
void Move_OnTimer(HWND hwnd);
void Move_OnKeydown(HWND hwnd);
void Move_OnPaint(HWND);


//главная функция
//#pragma argsused
int PASCAL WinMain(HINSTANCE hInst,      //дескриптор(идентификатор) программы
                   HINSTANCE hPrevInstance,
                   LPSTR     lpszCmdParam,
                   int       nCmdShow)
{
	MSG msg;                         //структура для работы с сообщениями

	if(!RegisterApp(hInst))          //регистрация окна
		return FALSE;

	if(!CreateApp(hInst,nCmdShow))   //создание окна
		return FALSE;

	while(GetMessage(&msg,NULL,0,0))  //цикл обработка сообщений 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

//регистрация окна  
BOOL RegisterApp(HINSTANCE hInst)
{
	WNDCLASS wc;

	wc.style         = CS_HREDRAW | CS_VREDRAW;     //стиль окна  
	wc.lpfnWndProc   = WndProc;                     //имя оконной процедуры
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;                       
	wc.hInstance     = hInst;                       //дескриптор программы
	wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); //иконка 
	wc.hCursor	 = LoadCursor(NULL, IDC_ARROW);     //форма курсора
	wc.hbrBackground = GetStockBrush(GRAY_BRUSH);   //цвет окна  
	wc.lpszMenuName  = TEXT("APP_MENU");                  //имя меню окна
	wc.lpszClassName = szClassName;                 //название программы 

	return RegisterClass(&wc);           //регистрация окна  
}


//создание окна  
HWND CreateApp(HINSTANCE hInstance, int nCmdShow)
{

	hInstApp = hInstance;

	 HWND hwnd;   //дескриптор окна 

	 hwnd = CreateWindow(szClassName,      //название программы   
		 	 szWindowTitle,        //заголовок окна  
			 WS_OVERLAPPEDWINDOW,  //вид окна 
			 CW_USEDEFAULT,        //x - координата окна  
			 CW_USEDEFAULT,        //y - координата окна  
			 CW_USEDEFAULT,        //ширина окна  
			 CW_USEDEFAULT,        //высота окна  
//			 400,
//			 330,
			 NULL,          
			 NULL,          
			 hInstance,     
			 NULL);         

	if(hwnd == NULL)
		return hwnd;

	ShowWindow(hwnd,nCmdShow);   //показать окно 
	UpdateWindow(hwnd);          //обновить окно 

	return hwnd;
}

//оконная процедура обрабатывающая сообщения
LRESULT CALLBACK  WndProc(HWND hwnd, UINT msg,
			WPARAM wParam, LPARAM lParam)
{

	switch(msg)
	{
		case WM_CREATE:
			Move_OnCreate();
			break;
		case WM_PAINT:
			Move_OnPaint(hwnd);
			break;
		case WM_TIMER:
			Move_OnTimer(hwnd);
			break;
		case WM_KEYDOWN:
			Move_OnKeydown(hwnd);
			break;
		case WM_DESTROY:
			Move_OnDestroy(hwnd);
			break;
		default:
			return DefWindowProc(hwnd,msg,wParam,lParam);
	}

	return 0L;

}





//размеры окна вывода в мировой системе координат
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;
}


//класс для работы с матрицами аффинных преобразований
//используются однородные координаты
class Matrix2D
{

public:
	double x[3][3];

	Matrix2D();                               //матрица единичная

	void rotate(double fi);                      //матрица поворота
	void displa(double kx, double ky);           //матрица растяжения
	void transl(double tx, double ty );          //матрица трансляции

	//перемножение матриц
	friend Matrix2D operator * (const Matrix2D&, const Matrix2D&);

};

Matrix2D::Matrix2D()
{
	x[0][0] =  1; x[0][1] =  0; x[0][2] =  0;
	x[1][0] =  0; x[1][1] =  1; x[1][2] =  0;
	x[2][0] =  0; x[2][1] =  0; x[2][2] =  1;
}


void Matrix2D::rotate(double fi)
{
	double cosfi = cos(fi), sinfi = sin(fi);
	x[0][0] = cosfi; x[0][1] = -sinfi; x[0][2] = 0;
	x[1][0] = sinfi; x[1][1] =  cosfi; x[1][2] = 0;
	x[2][0] =     0; x[2][1] =      0; x[2][2] = 1;
}

void Matrix2D::displa(double kx, double ky)
{
	x[0][0] = kx; x[0][1] =  0; x[0][2] = 0;
	x[1][0] =  0; x[1][1] = ky; x[1][2] = 0;
	x[2][0] =  0; x[2][1] =  0; x[2][2] = 1;
}

void Matrix2D::transl(double tx, double ty )
{
	x[0][0] =  1; x[0][1] =  0; x[0][2] = tx;
	x[1][0] =  0; x[1][1] =  1; x[1][2] = ty;
	x[2][0] =  0; x[2][1] =  0; x[2][2] =  1;
}


Matrix2D operator * (const Matrix2D& a, const Matrix2D& b)
{
	Matrix2D c;
	double s;
	for(int i=0; i<3; i++)
		for(int j=0; j<3; j++)
		{
			s = 0;
			for(int n=0; n<3; n++)
				s += a.x[i][n]*b.x[n][j];
			c.x[i][j] = s;
		}
	return c;
}


//структура для описания точек фигуры
struct Point
{
	double x;
	double y;
};


//аффинное преобразование координат точки P с помощью
//матрицы A
Point affine( Matrix2D A,  Point P)
{
	Point Pp;
		Pp.x = A.x[0][0]*P.x + A.x[0][1]*P.y + A.x[0][2]*1;
		Pp.y = A.x[1][0]*P.x + A.x[1][1]*P.y + A.x[1][2]*1;
	return Pp;
}



//координты вершин стрелки текущие и начальные
Point	PtA[7], PtA0[7];

//координты вершин самолета текущие и начальные
Point	PtP[7], PtP0[7];

//координты вершин занавески
Point	PtC0[6], PtC[6];



//"время" движения по траектории цента стрелки
	double tA , dtA, dtA0;

//"время" движения по траектории цента самолета
	double tP , dtP, dtP0;


//задаем угол поворота и коэффициенты растяжения стрелки
	double fiA, kxA, kyA;

//задаем угол поворота и коэффициенты растяжения самолета
	double fiP1, fiP2, kxP, kyP;

//создаем 6 матриц аффинный преобразований
	Matrix2D R, R1, T, D, A, T1, T2;

//началтные и текущие точки цента стрелки
	double xA0, yA0, xA2, yA2, xA1, yA1;

//началтные и текущие точки цента самолета
	double xP0, yP0, xP2, yP2, xP1, yP1;

//координаты окна вагона
	double xW1, yW1, xW2, yW2;
//координаты окна вагона в пикселях
	int xn1, yn1, xn2, yn2;


//флаг остановки и запуска таймера
	int MoveStop;

//время задержки таймера
UINT uElapse;

//функция обрабатывает сообщение  WM_CREATE
void Move_OnCreate()
{
//размеры поля вывода в мировых и экранных координатах
	xLeft = -10; xRight =  10; yBottom =  -7.5; yTop =  7.5;
	nLeft = 60; nRight  = 700; mTop  = 15; mBottom = 495;
//	nLeft = 0; nRight  = 400; mTop  = 0; mBottom = 300;

//начальные координты вершин стрелки
   PtA0[0].x =  1.0; PtA0[0].y =  0.0;
   PtA0[1].x =  2.0; PtA0[1].y =  0.0;
   PtA0[2].x =  0.0; PtA0[2].y =  2.0;
   PtA0[3].x = -2.0; PtA0[3].y =  0.0;
   PtA0[4].x = -1.0; PtA0[4].y =  0.0;
   PtA0[5].x = -1.0; PtA0[5].y = -2.0;
   PtA0[6].x =  1.0; PtA0[6].y = -2.0;

//начальные координты вершин самолета
   PtP0[0].x =  6.0; PtP0[0].y =  0.0;
   PtP0[1].x =  4.0; PtP0[1].y =  2.0;
   PtP0[2].x = -3.0; PtP0[2].y =  0.0;
   PtP0[3].x = -4.0; PtP0[3].y =  2.0;
   PtP0[4].x = -6.0; PtP0[4].y =  2.0;
   PtP0[5].x = -6.0; PtP0[5].y = -1.0;
   PtP0[6].x =  4.0; PtP0[6].y = -2.0;


// координты занавески
	PtC0[0].x = -1.0; PtC0[0].y =   0.0;
	PtC0[1].x =  0.0; PtC0[1].y =   0.0;
	PtC0[2].x = -0.5; PtC0[2].y =  -2.5;
	PtC0[3].x = -2.0; PtC0[3].y =  -1.5;
	PtC0[4].x = -3.5; PtC0[4].y =  -3.0;
	PtC0[5].x = -3.0; PtC0[5].y =   0.0;



//координаты окна вагона
	xW1 = -3.5, yW1 = 4, xW2 = 3.5, yW2 = -4;
	xn1 = xn(xW1); xn2 = xn(xW2); yn1 = ym(yW1); yn2 = ym(yW2);


//задаем угол поворота и коэффициенты растяжения стрелки
	fiA = 3.14/70; kxA = 0.997; kyA = 0.997;

//коэффициенты растяжения самолета
	kxP = 0.994; kyP = 0.994;

//шаг по времени стрелки
   dtA0 = 0.04;

//шаг по времени самолета
   dtP0 = 0.11;

//время задержки таймера
	uElapse = 15;

//флаг запуска таймера
	MoveStop = 1;

//загружаем в память растровое изображение
//hInstApp - идентификатор приложения из ресурсов которого
//загружается изображение
//"Bitmap" - идентификатор ресурса
	TheBitmap=LoadBitmap(hInstApp, TEXT("Bitmap"));

}



//функция обрабатывающая сообщение WM_KEYDOWN
void Move_OnKeydown(HWND hwnd)
{
	if(MoveStop == 0)
	{
		KillTimer(hwnd, 1);
		MoveStop = 1;
	}
	else
	{
		SetTimer(hwnd, 1, uElapse, NULL);
		MoveStop = 0;
	}
}


//функция обрабатывает сообщение  WM_DESTROY
void Move_OnDestroy(HWND hwnd)
{
	KillTimer(hwnd, 1);
	DeleteObject(TheBitmap);   //убираем растровое изображение из памяти
	PostQuitMessage(0);   //закрывает окно 
}

//траектория стрелки
Point TrajA(double t)
{
	Point P;
   P.x = t - 8;
   P.y = 4 - (t - 8)*(t - 8)/10;
   return P;
}

//траектория самолета
Point TrajP(double t)
{
	Point P;
   P.x = -7.5 + 1.7*(t-1.5) - 4/(1+0.075*t)*sin(1.5*(t-1.5));
   P.y = 1 +0.25*(t-1.5)- 4/(1+0.075*t)*cos(1.5*(t-1.5));
   return P;
}



void Land(HDC hdc)
{

	HBRUSH hbrush, hbrushOld;
	HPEN hpen1, hpen2, hpenOld;

	hbrush = CreateSolidBrush(RGB(0,200,0));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	hpen1 = CreatePen(PS_SOLID,3,RGB(255,255,255));
	hpenOld = (HPEN)SelectObject(hdc,hpen1);         // выбираем перо hpen



   Ellipse(hdc,nLeft+160,mTop+20,nRight-160,mBottom-20);

 	//рисуем координатные оси
	hpen2 = CreatePen(PS_SOLID,1,RGB(0,255,255));
	SelectObject(hdc,hpen2);    // выбираем перо hpen

	int nb, ne, mb, me;

	nb = xn(xLeft); mb = ym(0);
	MoveToEx(hdc, nb, mb, 0);
	ne = xn(xRight); me = ym(0);
	LineTo(hdc,ne,me);

	nb = xn(0); mb = ym(yBottom);
	MoveToEx(hdc, nb, mb, 0);
	ne = xn(0); me = ym(yTop);
	LineTo(hdc,ne,me);

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen1);           //убираем перо hpen
	DeleteObject(hpen2);           //убираем перо hpen
   SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen
}


//рисует стрелку по координатам вершин Pt в точке x2, y2
void Arrow(HDC hdc, Point *Pt, int N, double x1,double y1,
           double x2,double y2,double fi,double kx,double ky)
{

//создаем матрицы аффинного преобразования
		T1.transl(-x1,-y1);
		R.rotate(fi);
		D.displa(kx, ky);
		T.transl(x2-x1,y2-y1);
		T2.transl(x1,y1);

		A = T2*T*D*R*T1;

//совершаем аффинное преобразование точек фигуры
		for(int n=0; n<7; n++)
			Pt[n] = affine(A,Pt[n]);


	POINT pt[7];
	for(int i = 0; i < N; i++)
	{
      		pt[i].x = xn(Pt[i].x); pt[i].y = ym(Pt[i].y);
	}

	HBRUSH hbrush, hbrushOld;
	HPEN hpen, hpenOld;

	hbrush = CreateSolidBrush(RGB(255,0,0));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	hpen = CreatePen(PS_SOLID,2,RGB(0,0,255));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen

	Polygon(hdc,pt,N);

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen
   SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen

}


//след от стрелки
void TracA(HDC hdc, double te, double dt)
{
	double x, y, t;

	t = 0;
	x = TrajA(t).x;
	y = TrajA(t).y;

	HPEN hpen, hpenOld;

	hpen = CreatePen(PS_SOLID,2,RGB(255,255,0));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen

	MoveToEx(hdc,xn(x),ym(y),0);
	do{
		t += dt;
		x = TrajA(t).x;
		y = TrajA(t).y;
		LineTo(hdc,xn(x),ym(y));
	}while(t < te);

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen

}


//рисует стрелку по координатам вершин Pt в точке x2, y2
void Plain(HDC hdc, Point *Pt, int N, double x1,double y1,
           double x2,double y2,double fi1,double fi2,double kx,double ky)
{

//создаем матрицы аффинного преобразования
		T1.transl(-x1,-y1);
		R1.rotate(-fi1);
		R.rotate(fi2);
		D.displa(kx, ky);
		T.transl(x2-x1,y2-y1);
		T2.transl(x1,y1);

		A = T2*T*D*R*R1*T1;

//совершаем аффинное преобразование точек фигуры
		for(int n=0; n<7; n++)
			Pt[n] = affine(A,Pt[n]);


	POINT pt[7];
	for(int i = 0; i < N; i++)
	{
      		pt[i].x = xn(Pt[i].x); pt[i].y = ym(Pt[i].y);
	}

	HBRUSH hbrush, hbrushOld;
	HPEN hpen, hpenOld;

	hbrush = CreateSolidBrush(RGB(0xD0,0xD0,0xC0));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	hpen = CreatePen(PS_SOLID,1,RGB(0x70,0x70,0x70));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen

	Polygon(hdc,pt,N);

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen
   SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen

}

//след от самолета
void TracP(HDC hdc, double te, double dt)
{
	double x, y, t;

	t = 0;
	x = TrajP(t).x;
	y = TrajP(t).y;

	HPEN hpen, hpenOld;

	hpen = CreatePen(PS_SOLID,1,RGB(255,255,255));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen

	MoveToEx(hdc,xn(x),ym(y),0);
	do{
		t += dt;
		x = TrajP(t).x;
		y = TrajP(t).y;
		LineTo(hdc,xn(x),ym(y));
	}while(t < te);

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen

}




void WindowWagon(HDC hdc)
{

	HPEN hpen, hpenOld;

	hpen = CreatePen(PS_SOLID,8,RGB(255,251,240));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen



	int xb, yb, xe, ye;

	xb = xn(xW1) - 4; yb = ym(yW1) - 4;
	xe = xn(xW2) + 4; ye = ym(yW2) + 4;

	MoveToEx(hdc,xb,yb,0);
	LineTo(hdc,xe,yb);
	LineTo(hdc,xe,ye);
	LineTo(hdc,xb,ye);
	LineTo(hdc,xb,yb);


	SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen


	hpen = CreatePen(PS_SOLID,5,RGB(0,251,240));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen




	xb = xn(xW1)-15; yb = (ym(yW1) + ym(yW2))/2;
	xe = xn(xW2)+15; ye = yb;

	MoveToEx(hdc,xb,yb,0);
	LineTo(hdc,xe,ye);

	SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen



	HBRUSH hbrush, hbrushOld;
	hbrush = CreateSolidBrush(RGB(128,128,64));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	
	for(int i=0; i<5; i++)
		Rectangle(hdc,30+nLeft+10+i*25, mTop+100, 30+nLeft+30+i*25, mBottom-100);

	for(int i=0; i<5; i++)
		Rectangle(hdc,470+nLeft+10+i*25, mTop+100, 470+nLeft+30+i*25, mBottom-100);

    SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen


	POINT Poly[4];

	Poly[0].x = nLeft + 200; Poly[0].y = mBottom - 100;
	Poly[1].x = nLeft + 440; Poly[1].y = mBottom - 100;
	Poly[2].x = nLeft + 490; Poly[2].y = mBottom - 70;
	Poly[3].x = nLeft + 150; Poly[3].y = mBottom - 70;

	hbrush = CreateSolidBrush(RGB(180,180,103));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	hpen = CreatePen(PS_SOLID,3,RGB(190,240,240));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen
		Polygon(hdc,Poly,4);
	SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen
    SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen

	hbrush = CreateSolidBrush(RGB(80,80,64));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	Rectangle(hdc, (nLeft + nRight)/2-20, mBottom-67, (nLeft + nRight)/2+20, mBottom);
    SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen



	POINT Pola[6], Polb[6];

	Pola[0].x = nLeft + 0; Pola[0].y = mBottom - 0;
	Pola[1].x = nLeft + 135; Pola[1].y = mBottom - 0;
	Pola[2].x = nLeft + 130; Pola[2].y = mBottom - 20;
	Pola[3].x = nLeft + 35; Pola[3].y = mBottom - 20;
	Pola[4].x = nLeft + 20; Pola[4].y = mBottom - 170;
	Pola[5].x = nLeft + 0; Pola[5].y = mBottom - 230;

	Polb[0].x = nRight + 0; Polb[0].y = mBottom - 0;
	Polb[1].x = nRight - 135; Polb[1].y = mBottom - 0;
	Polb[2].x = nRight - 130; Polb[2].y = mBottom - 20;
	Polb[3].x = nRight - 35; Polb[3].y = mBottom - 20;
	Polb[4].x = nRight - 20; Polb[4].y = mBottom - 170;
	Polb[5].x = nRight - 0; Polb[5].y = mBottom - 230;

	
	hbrush = CreateSolidBrush(RGB(128,68,0));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	Polygon(hdc,Pola,6);
	Polygon(hdc,Polb,6);
    SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen

	static int smok = 0;
	
	smok++;

LOGFONT lf;
HFONT hFont, hFontOld;
	
memset(&lf, 0, sizeof(LOGFONT)); //заполняем нулями поля структуры lf
lf.lfHeight = 35;
lf.lfWeight = FW_BOLD;
//strcpy(lf.lfFaceName, "Courier New");


//	strcpy(lf.lfFaceName, "Arial");
	wcsncpy_s(lf.lfFaceName, LF_FACESIZE,TEXT("Courier New"),11);


//lf.lfEscapement = 450;

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

	if((smok > 150) && (smok < 200))
	{
		SetTextColor(hdc, RGB(255, 0, 0)); 
	}
	else
		SetTextColor(hdc, RGB(52,105,105));
		if(smok>200) smok = 0;
	SetBkColor(hdc, RGB(52,105,105));
	TextOut(hdc, (nLeft+nRight)/2-150, mTop+ 30, TEXT("N O  S M O K I N G"), 17);

SelectObject(hdc, hFontOld); 
DeleteObject(hFont);   



}



//рисует занавеску по вершинам Pt
void Curtain(HDC hdc, Point *Pt, int N, double t)
{

	Pt[2].x = PtC0[2].x + 0.5*sin(1.3*t);
	Pt[3].y = PtC0[3].y + 0.7*cos(2.5*t);

	Pt[4].x = PtC0[4].x - 0.5*sin(0.9*t);
	Pt[4].y = PtC0[4].y + 0.3*sin(0.8*t);


	POINT pt[6];
	for(int i = 0; i < N; i++)
	{
      		pt[i].x = xn(Pt[i].x); pt[i].y = ym(Pt[i].y);
	}

	HBRUSH hbrush, hbrushOld;
	HPEN hpen, hpenOld;

	hbrush = CreateSolidBrush(RGB(255,255,200));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	hpen = CreatePen(PS_SOLID,2,RGB(100,255,255));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen

	Polygon(hdc,pt,N);

	MoveToEx(hdc,xn(Pt[0].x),ym(Pt[0].y),0);
	LineTo(hdc,xn(Pt[3].x),ym(Pt[3].y));

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen
   SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen






}







//функция обрабатывает сообщение  WM_PAINT
void Move_OnPaint(HWND hwnd)
{

	HDC hdc;
	PAINTSTRUCT ps;

	hdc = BeginPaint(hwnd, &ps);  //получаем контекст устройства 


	HBRUSH hbrush, hbrushOld;
	HPEN hpen, hpenOld;

	hbrush = CreateSolidBrush(RGB(0,0,0));
	hbrushOld = (HBRUSH)SelectObject(hdc,hbrush);     //выбираем кисть hbrush
	hpen = CreatePen(PS_SOLID,3,RGB(255,255,255));
	hpenOld = (HPEN)SelectObject(hdc,hpen);         // выбираем перо hpen

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

   SelectObject(hdc,hpenOld);
	DeleteObject(hpen);           //убираем перо hpen
   SelectObject(hdc,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen


	//создаем контекст памяти hdcMem связаный с контекстом экрана hdc
	HDC hdcMem = CreateCompatibleDC(hdc);
	//помещаем растровое изображежние TheBitmap в контекст памяти hdcMem
	HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMem, TheBitmap); 
	
	//копирование изображения из контекста памяти hdcMem в контекст окна hdc
	BitBlt(hdc, nLeft, mTop, nRight-nLeft, mBottom-mTop, hdcMem, 0, 0, SRCCOPY);

	
	SelectObject(hdcMem, hBitmapOld); //востанавливаем контекст памяти
	DeleteDC(hdcMem);  //  освобождаем контекст памяти




//   Land(hdc);

	SetTextColor(hdc,RGB(230,230,220));
	SetBkColor(hdc,RGB(0,0,0));
   TextOut(hdc, 225,100,TEXT(" P r e s s   a n y   k e y "),27);

//начальный момент времени для стрелки
//   tA = 0; dtA = dtA0;

//начальное положение центра лодки
//	xA0 = TrajA(tA).x;
//	yA0 = TrajA(tA).y;

//	for(int n=0; n<7; n++)
//   	PtA[n] = PtA0[n];

//рисуем стрелку в начльной точке
//	Arrow(hdc,PtA,7,0,0,xA0,yA0,0,0.75,0.75);

//  	xA1 = xA0; yA1 = yA0;

//начальный момент времени для самолета
   tP = 0; dtP = dtP0;

//начальное положение центра самолета
//	xP0 = TrajP(tA).x;
//	yP0 = TrajP(tA).y;

//	for(int n=0; n<7; n++)
// 	PtP[n] = PtP0[n];
	for(int n=0; n<6; n++)
 	PtC[n] = PtC0[n];

//рисуем стрелку в начльной точке
//	Plain(hdc,PtP,7,0,0,xP0,yP0,0,0,0.3,0.3);

//   fiP1 = 0;
//   xP1 = xP0; yP1 = yP0;



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

}



//функция обрабатывает сообщение  WM_TIMER
void Move_OnTimer(HWND hwnd)
{
	HDC hdcMem, hdcWin;
	HBITMAP hBitmap, hBitmapOld;
	//получаем контекст экрана
	hdcWin = GetDC(hwnd);  
	//создаем контекст памяти связаный с контекстом экрана
	hdcMem = CreateCompatibleDC(hdcWin); 
                     
    //контексту памяти надо придать вид экрана - подходт битовая карта с форматом
    // как у экрана. В памяти будем рисовать на битовой карте
	
	//создаем (пустую) битовую карту совместмую с контекстом экрана
	hBitmap = CreateCompatibleBitmap(hdcWin, nRight, mBottom); 
    //помещаем битовую карту hBitmap в контекст памяти hdcMem          
	hBitmapOld = (HBITMAP)SelectObject(hdcMem, hBitmap); 

	HBRUSH hbrush, hbrushOld;
	hbrush = CreateSolidBrush(RGB(52,105,105));
	hbrushOld = (HBRUSH)SelectObject(hdcMem,hbrush);     //выбираем кисть hbrush
 		Rectangle(hdcMem,nLeft,mBottom,nRight,mTop);
    SelectObject(hdcMem,hbrushOld);
	DeleteObject(hbrush);           //убираем перо hpen
	

	//растровое изображение TheBitmap поместим в другой контекст памяти hdcMem1
	//а затем скопируем в основной контекст памяти hdcMem. После этого в 
	//основном контексте памяти будут рисоваться другие графические
	//объекты сцен анимации
	static int nPixel = 0;
	//создаем вспомогательный контекст памяти hdcMem1
	// связаный с основным контекстом памяти hdcMem
	HDC hdcMem1 = CreateCompatibleDC(hdcMem); 
    //помещаем растровое изображение TheBitmap в контекст памяти hdcMem1
	SelectObject(hdcMem1, TheBitmap); 
	//растровое изображение TheBitmap из вспомогательного 
	//контекста памяти hdcMem1 копируем в основной контекст памяти hdcMem 
//	BitBlt(hdcMem, nLeft,mTop, nRight-nLeft, mBottom-mTop, hdcMem1, 0,0, SRCCOPY);
	BitBlt(hdcMem, xn1,yn1,xn2-xn1,yn2-yn1, hdcMem1, nPixel++,yn1, SRCCOPY);
	if(nPixel+(xn2-xn1)>nRight-nLeft)
		nPixel = 0;
//		tA += dtA;
//		xA2 = TrajA(tA).x;
//		if(xA2 >= xRight-1)
//		{
//			xA2 = xRight-1;
//			tA -= dtA;
//		}
//		yA2 = TrajA(tA).y;

//рисуем фигуру в точке (x2, y2)
//	Arrow(hdcMem,PtA,7,xA1,yA1,xA2,yA2,fiA,kxA,kyA);
//	TracA(hdcMem, tA, dtA);

//	xA1 = xA2; yA1 = yA2;

//   Land(hdcMem);

		tP += 0.02;
//		dtP *= 0.99115;
//		xP2 = TrajP(tP).x;
//		yP2 = TrajP(tP).y;

//      fiP2 =atan2l(yP2-yP1,xP2-xP1);

//рисуем фигуру в точке (x2, y2)
//	Plain(hdcMem,PtP,7,xP1,yP1,xP2,yP2,fiP1,fiP2,kxP,kyP);
//	TracP(hdcMem, tP, dtP);

//	xP1 = xP2; yP1 = yP2; fiP1 = fiP2;


	WindowWagon(hdcMem);
	Curtain(hdcMem, PtC, 6, tP);
	
	//копируем контекст памяти в контекст экрана
	BitBlt(hdcWin, nLeft,mTop, nRight-nLeft, mBottom-mTop, hdcMem, nLeft,mTop, SRCCOPY);

	SelectObject(hdcMem, hBitmapOld); //востанавливаем контекст памяти
	DeleteObject(hBitmap);           //убираем битовую карту
	DeleteDC(hdcMem);                //  освобождаем контекст памяти
	DeleteDC(hdcMem1);               //  освобождаем контекст памяти
	ReleaseDC(hwnd,hdcWin);          //освобождаем контекст экрана
}






Соседние файлы в папке move09
  • #
    17.04.2018921.65 Кб5field.bmp
  • #
    17.04.201823.72 Кб6mov09.cpp
  • #
    17.04.201829 б5mov09.rc
  • #
    17.04.20184.04 Кб5move09.vcproj
  • #
    17.04.20181.41 Кб5move09.vcproj.HOME.User.user
  • #
    17.04.20181.42 Кб6move09.vcproj.VICTOR1.victor.user