//Инфо
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);
}