Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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); //освобождаем контекст экрана
}