Смекни!
smekni.com

Розробка програми для демонстрації автомобільного руху через залізнодорожний переїзд (стр. 4 из 4)

//Инфо

Accel[2].fVirt=FVIRTKEY|FCONTROL;

Accel[2].key=0x49;//"I"

Accel[2].cmd=IDM_INFO;

//Выход

Accel[3].fVirt=FVIRTKEY|FCONTROL;

Accel[3].key=0x45;//"E"

Accel[3].cmd=IDM_EXIT;

return CreateAcceleratorTable((LPACCEL)Accel,4);

}

int WINAPI WinMain (

HINSTANCE hInst,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow )

{

MSG msg; /* Структура для хранения сообщений */

static HWND hWnd; /* Дескриптор окна */

BOOL bRet; // for return value of GetMessage

hInstance=hInst;

if(!RegClass(WndProc,szMainClass,COLOR_APPWORKSPACE,IDI_ICON1,IDC_CURSOR1,IDR_MENU1))

return FALSE;

hWnd = CreateWindow (

szMainClass, /* Создаетсяокнонашегокласса */

szTitle, /* Заголовоксоздаваемогоокна */

WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE|WS_BORDER|WS_DLGFRAME|

TBSTYLE_TOOLTIPS, /* Стандартный тип окна */

CW_USEDEFAULT, // стандартн. горизонтальное размещение

CW_USEDEFAULT, // стандартное вертикальное

1000, //стандартная ширина окна

600, // стандартная высота окна

NULL, // дескриптор родительского окна

NULL, // меню у окна отсутствует

hInstance, // дескриптор экземпляра программы */

NULL // указатель на данные окна (для MDI-окон)

);

if (!hWnd) return NULL;

but[0].iBitmap=STD_FILESAVE;

but[0].idCommand=IDM_START;

but[0].fsState=TBSTATE_ENABLED;

but[0].fsStyle=TBSTYLE_GROUP;

but[1].iBitmap=STD_CUT;

but[1].idCommand=IDM_EDIT;

but[1].fsState=TBSTATE_ENABLED;

but[1].fsStyle=TBSTYLE_BUTTON;

but[2].iBitmap=STD_COPY;

but[2].idCommand=IDM_INFO;

but[2].fsState=TBSTATE_ENABLED;

but[2].fsStyle=TBSTYLE_BUTTON;

but[3].iBitmap=STD_FILEOPEN;

but[3].idCommand=IDM_EXIT;

but[3].fsState=TBSTATE_ENABLED;

but[3].fsStyle=TBSTYLE_BUTTON;

CreateToolbarEx(hWnd,

WS_CHILD|WS_VISIBLE|WS_DLGFRAME|TBSTYLE_TOOLTIPS,

IDR_TOOLBAR1,

0,

HINST_COMMCTRL,

IDB_STD_SMALL_COLOR,

but,

4,

0,0,0,0,

sizeof(TBBUTTON));

ShowWindow(hWnd,nCmdShow); // функцiявiдображеннявiкна

UpdateWindow(hWnd); // функцiяоновленнявiкна

HACCEL hAccel=CreateAccelTable();

while ((GetMessage(&msg, NULL, 0, 0))!= 0)

{

if (!TranslateAccelerator( hWnd, // handle to receiving window

hAccel, // handle to active accelerator table

&msg)) // message data

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

DestroyAcceleratorTable(hAccel);

return msg.wParam;

}

BOOL RegClass(WNDPROC Proc, LPCSTR szName,UINT brBackground,UINT ic,UINT cur,UINT menu)

{

WNDCLASS wc; /* Структура класса окна */

wc.lpszClassName = szName, /* имя класса */

wc.lpfnWndProc = Proc; /* оконная процедура класса */

wc.style = CS_HREDRAW | CS_VREDRAW|CS_BYTEALIGNCLIENT;

wc.cbClsExtra=wc.cbWndExtra=0; /* стильокна */

wc.hInstance = hInstance; /* дескрипторэкземплярапрограммы */

wc.hIcon = LoadIcon( hInstance, (LPCSTR)ic );

wc.hCursor = LoadCursor( hInstance, (LPCSTR)cur );

wc.hbrBackground = (HBRUSH)(brBackground+1);

wc.lpszMenuName = (LPCSTR) menu;

return(RegisterClass(&wc)!=0); /* Регистрируемклассокна */

}

/* Оконнаяпроцедура */

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam )

{

HDC hCompDC, hdc; // хендликонтекстівпристрою

HBITMAP hBmpBckGrnd, hBmpTrain, oBitmap, hBmpCar1, hBmpShlagbaym;

// хендлинашогозображенняістарого

BITMAP bitmap; // длязберіганнярозмірівзображення

RECT r; // длязберіганнярозмірівекрану

RECT train, car1, shlagbm;

static HWND hStatus;

int pParts[2];

SetTimer(hWnd,1,Speed,NULL);

GetClientRect(hWnd, &r);

pParts[0]=500;

pParts[1]=1000;

shlagbm.top=Y3;

shlagbm.left=X3;

shlagbm.bottom=Y3+215;

shlagbm.right=X3+215;

car1.left=X2;

car1.top=Y2;

car1.right=X2+96+13;

car1.bottom=Y2+168+13;

train.left=X-10;

train.top=Y;

train.right=X+538;

train.bottom=Y+118;

Y=85;

switch(msg)

{

case WM_CREATE:

{

hStatus=CreateStatusWindow(WS_CHILD|WS_VISIBLE, "Готово", hWnd, ID_STATUS);

SendMessage(hStatus, SB_SETPARTS, 2, (LPARAM)pParts);

return 0;

}

case WM_NOTIFY:

{

LPTOOLTIPTEXT t;

t=(LPTOOLTIPTEXT)lParam;

if (t->hdr.code!=TTN_NEEDTEXT)

return 0;

switch (t->hdr.idFrom)

{

case IDM_START:

t->lpszText="Стартпоїзда";

break;

case IDM_EDIT:

t->lpszText="Керуванняшлагбаумом";

break;

case IDM_INFO:

t->lpszText="Інформаціяпровиконавця";

break;

case IDM_EXIT:

t->lpszText="Вихід";

break;

}

}

case WM_PAINT:

{

PAINTSTRUCT ps; // структурадляпараметрівконтексту

hdc = BeginPaint(hWnd, &ps); // отримуємохендлконтекступристрою

hBmpBckGrnd = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));

GetObject ( hBmpBckGrnd, sizeof(BITMAP),&bitmap); // отрималирозміризображення

hCompDC = CreateCompatibleDC ( hdc );

oBitmap = (HBITMAP)SelectObject ( hCompDC, hBmpBckGrnd );

// ввели наше зображення у контекст в пам’яті

// і запам’ятали те, що витіснили звідти

StretchBlt (hdc, r.left, r.top, r.right, r.bottom, // куди

hCompDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, // звідки

SRCCOPY); // як

// “натягнули” зображення в пам’яті на екран

SelectObject ( hCompDC, oBitmap );// повернули в контекст в пам’яті попередній вміст

DeleteObject ( hBmpBckGrnd ); // знищилиоб’єкт

if (car==0)

{

hBmpCar1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP4));

DrawTransparentBitmap(hdc,// Конечный DC.

hBmpCar1,// Битмап, которыйбудетнарисован.

X2, // координата X.

Y2, // координата Y.

0x00FFFFFF); // Цвет для прозрачных

// пикселей (в данном случае белый

DeleteObject ( hBmpCar1 ); // знищилиоб’єкт

}

if (car==1)

{

hBmpCar1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP10));

DrawTransparentBitmap(hdc, // Конечный DC.

hBmpCar1, // Битмап, которыйбудетнарисован.

X2, // координата X.

Y2, // координата Y.

0x00FFFFFF); // Цвет для прозрачных

// пикселей (в данном случае белый

DeleteObject ( hBmpCar1 ); // знищилиоб’єкт

}

if(par==1)

{

SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Увага!!!ЇдеПоїзд!!!");

hBmpTrain = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2));

DrawTransparentBitmap(hdc, // Конечный DC.

hBmpTrain, // Битмап, которыйбудетнарисован.

X, // координата X.

Y, // координата Y.

0x00FFFFFF); // Цвет для прозрачных

// пикселей (в данном случае

DeleteObject ( hBmpTrain ); // знищилиоб’єкт

}

else

SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Поїздщедалеко :)");

if(shlagbaym==0)

{

SendMessage(hStatus, SB_SETTEXT, 1, (LONG)"Увага! Шлагбаумвідкрито!");

if (w==0)

{

InvalidateRect(hWnd, &shlagbm, FALSE);

w++;

}

hBmpShlagbaym = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP9));

DrawTransparentBitmap(hdc, // Конечный DC.

hBmpShlagbaym,// Битмап, которыйбудетнарисован.

X3, // координата X.

Y3, // координата Y.

0x00FFFFFF); // Цвет для прозрачных

// пикселей (в данном случае белый

DeleteObject ( hBmpShlagbaym ); // знищили об’єкт

}

if(shlagbaym==1)

{

SendMessage(hStatus, SB_SETTEXT, 1, (LONG)"Увага! Шлагбаумзакрито!");

if (w==1)

{

InvalidateRect(hWnd, &shlagbm, FALSE);

w--;

}

hBmpShlagbaym = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP5));

DrawTransparentBitmap(hdc, // Конечный DC.

hBmpShlagbaym,// Битмап, которыйбудетнарисован.

X3, // координата X.

Y3, // координата Y.

0x00FFFFFF); // Цвет для прозрачных

// пикселей (в данном случае белый

DeleteObject ( hBmpShlagbaym ); // знищили об’єкт

}

DeleteDC ( hCompDC );

EndPaint(hWnd, &ps); // знищуємо контекст пристрою

return 0;

}

case WM_TIMER:

{

if ((shlagbaym==0)||(Y2<330)||(Y2>350))

{

if (car==0)

{

Y2-=13;

InvalidateRect(hWnd, &car1, FALSE);

}

if (car==1)

{

if (wham==0)

{

PlaySound("wham", hInstance, SND_RESOURCE|SND_ASYNC);

wham++;

}

X2+=13;

InvalidateRect(hWnd, &car1, FALSE);

}

if ((Y2<-200)||(X2>1000))

{

Y2=800;

X2=450;

}

}

if (par==1)

{

X+=10;

InvalidateRect(hWnd, &train, FALSE);

if(X<=(X2+45)&&(X+538)>=(X2-1)&&(Y+118)>=(Y2+1)&&(Y<=Y2+85))

car=1;

if (X>1001)

{

X2=450;

par=0;

car=0;

wham=0;

}

}

return 0;

}

case WM_COMMAND:

{

switch(LOWORD(wParam))

{

case IDM_EXIT:

{

int k=MessageBox(hWnd, "Вивпевнені?","Вихід?",

MB_OKCANCEL|MB_ICONQUESTION|MB_SYSTEMMODAL);

if (k==IDOK) DestroyWindow(hWnd);

break;

}

case IDM_VARIANT:

{

DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DlgProg2);

return 0;

}

case IDM_INFO:

{

DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG3), hWnd, DlgProg3);

return 0;

}

case IDM_EDIT:

{

int i=0;

i=1;

DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProg);

InvalidateRect(hWnd, &shlagbm, FALSE);

return 0;

}

case IDM_HELP:

{

DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG4), hWnd, DlgProg4);

return 0;

}

case IDM_START:

{

PlaySound("train", hInstance, SND_RESOURCE|SND_ASYNC);

InvalidateRect(hWnd, &r, FALSE);

X=-500;

par=1;

car=0;

X2=450;

wham=0;

return 0;

}

}

return 0;

}

case WM_DESTROY:

{

PostQuitMessage(0);

return 0;

}

}

return DefWindowProc (hWnd, msg, wParam, lParam);

}

BOOL CALLBACK DlgProg(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch (msg)

{

case WM_CLOSE:

{

EndDialog(hdWnd, 0);

return 1;

}

case WM_COMMAND:

{

switch (wParam)

{

case IDC_UPBUTTON:

{

if (par!=1)

{

shlagbaym=0;

}

EndDialog(hdWnd, 0);

return 1;

}

case IDC_DOWNBUTTON:

{

shlagbaym=1;

EndDialog(hdWnd, 0);

return 1;

}

}

return 1;

}

}

return 0;

}

BOOL CALLBACK DlgProg2(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch (msg)

{

case WM_CLOSE:

{

EndDialog(hdWnd, 0);

return 1;

}

}

return 0;

}

BOOL CALLBACK DlgProg3(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch (msg)

{

case WM_COMMAND:

{

switch (wParam)

{

case IDOK:

{

EndDialog(hdWnd, 0);

return 1;

}

}

return 1;

}

case WM_CLOSE:

{

EndDialog(hdWnd, 0);

return 1;

}

}

return 0;

}

BOOL CALLBACK DlgProg4(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch (msg)

{

case WM_COMMAND:

{

switch (wParam)

{

case IDOK:

{

EndDialog(hdWnd, 0);

return 1;

}

}

return 1;

}

case WM_CLOSE:

{

EndDialog(hdWnd, 0);

return 1;

}

}

return 0;

}

void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart,

short yStart, COLORREF cTransparentColor)

{

BITMAP bm;

COLORREF cColor;

HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave;

HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;

HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;

POINT ptSize;

hdcTemp = CreateCompatibleDC(hdc);

SelectObject(hdcTemp, hBitmap); // Выбираембитмап

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);

ptSize.x = bm.bmWidth; // Получаемширинубитмапа

ptSize.y = bm.bmHeight; // Получаемвысотубитмапа

DPtoLP(hdcTemp, &ptSize, 1); // Конвертируем из координат

// устройства в логические

// точки

// Создаём несколько DC для хранения временных данных.

hdcBack = CreateCompatibleDC(hdc);

hdcObject = CreateCompatibleDC(hdc);

hdcMem = CreateCompatibleDC(hdc);

hdcSave = CreateCompatibleDC(hdc);

// Создаём битмап для каждого DC.

// Монохромный DC

bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

// Монохромный DC

bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

// В каждом DC должен быть выбран объект битмапа для хранения

// пикселей.

bmBackOld = (HBITMAP)SelectObject(hdcBack, bmAndBack);

bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject);

bmMemOld = (HBITMAP)SelectObject(hdcMem, bmAndMem);

bmSaveOld = (HBITMAP)SelectObject(hdcSave, bmSave);

// Устанавливаемрежиммаппинга.

SetMapMode(hdcTemp, GetMapMode(hdc));

// Сохраняем битмап, переданный в параметре функции, так как

// он будет изменён.

BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

// Устанавливаем фоновый цвет (в исходном DC) тех частей,

// которые будут прозрачными.

cColor = SetBkColor(hdcTemp, cTransparentColor);

// Создаём маску для битмапа путём вызова BitBlt из исходного

// битмапа на монохромный битмап.

BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,

SRCCOPY);

// Устанавливаем фоновый цвет исходного DC обратно в

// оригинальный цвет.

SetBkColor(hdcTemp, cColor);

// Создаём инверсию маски.

BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,

NOTSRCCOPY);

// Копируем фон главного DC в конечный.

BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart,

SRCCOPY);

// Накладываем маску на те места, где будет помещён битмап.

BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);

// Накладываем маску на прозрачные пиксели битмапа.

BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);

// XOR-им битмап с фоном на конечном DC.

BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);

// Копируем на экран.

BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0,

SRCCOPY);

// Помещаем оригинальный битмап обратно в битмап, переданный в

// параметре функции.

BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

// Удаляем битмапы из памяти.

DeleteObject(SelectObject(hdcBack, bmBackOld));

DeleteObject(SelectObject(hdcObject, bmObjectOld));

DeleteObject(SelectObject(hdcMem, bmMemOld));

DeleteObject(SelectObject(hdcSave, bmSaveOld));

// Удаляем DC изпамяти.

DeleteDC(hdcMem);

DeleteDC(hdcBack);

DeleteDC(hdcObject);

DeleteDC(hdcSave);

DeleteDC(hdcTemp);

}