Смекни!
smekni.com

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

У даній курсовій роботі MessageBox використовується при виході із програми в такому вигляді:

MessageBox(hWnd,

"Вивпевнені?",

"?",

MB_OKCANCEL|MB_ICONQUESTION|MB_SYSTEMMODAL);

Інші пункти меню розглянемо під наступними розділами.

2.3 Реалізація виведення графічних зображень

Даний програмний продукт має доволі багато графічної інформації, що на думку виконавця повинно надавати програмі кращого вигляду.

Виведення графічної інформації відбувається при обробці повідомлення системи WM_PAINT за допомогою об’єкту типу HDC, за допомогою функції BeginPaint().

Так в головному вікні виводиться фоновий малюнок, значок університету та текст. Малюнок та значок являють собою растрові зображення, для їх виводу використовують тип BITMAP. Ці об’єкти потрібно загрузити з файлу в пам’ять, визначити розміри вікна і розташувати по своїм місцям у вікні.

Програмний код, що реалізує виведення фонового малюнку представлений нижче.

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 ); // знищили об’єкт

2.4 Програмна реалізація вікна

Вікно повинне мати свою віконну функцію:

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;

Кожного разу вікно потрібно показати та обновити у пам’яті:

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

Щоб зареєструвати вікно потрібно використати API-функцію RegisterClass(&wc).

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

Для створення діалогового вікна потрібна наявність трьох компонентів:

– шаблону діалогу (описує форму і розміщення самого діал. вікна і всіх його внутрішніх елементів керування на екрані);

– програмного коду, який утворює і відображає його на екрані;

– діалогової процедури, яка обслуговує взаємодію користувача з блоком діалогу.

Діалогова процедура потрібна для обробки повідомлень, пов’язаних з обміном даних у діалоговому вікні.

Для дочірніх та діалогових вікон потрібно об’явити прототип віконної функції:

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

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

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

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

Програмна реалізація діалогового вікна, що містить завдання:

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

{

switch (msg)

{

case WM_CLOSE:

{

EndDialog(hdWnd, 0);

return 1;

}

}

return 0;

}

2.5 Програмна реалізація загальних елементів керування та музики

Для того, щоб показати свої вміння більш обширного використання ресурсів мови програмування VС++, я використав два загальних елементи керування: Стрічки стану та акселератори.

Щоб додати до проекту будь – який елемент керування потрібно зробити такі додаткові дії:

– #include <commctrl.h>

– Project  Setting  Link  Object&bsol;Library modules : comctl32.lib

Підключаємо до проекту бібліотеку <commctrl.h>, яка містить бази даних для роботи з загальними елементами керування та дописуємо по вище написаному напрямку рядок comctl32.lib.

Добавлення рядка стану має такий вигляд:

#define ID_STATUS 120

...

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

{

static HWND hStatus;

switch(msg)

{

case WM_CREATE:

{

hStatus = CreateStatusWindow (WS_CHILD|WS_VISIBLE,

"Готово", hWnd, ID_STATUS);

return 0;

}

...

}

Рядок стану – це дочірнє вікно з певними параметрами. Для того, щоб розбити цей рядок на декілька областей потрібно:

static int parts[2];

...

parts[0]=cx/2; parts[1]=cx;

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

...

Для підключення акселераторів ( комбінація клавіш ) потрібно:

– Insert  Resource  Accelerator

– Описати потрібний набір клавіш для пунктів меню

Або в самій програмі потрібно написати:

HACCEL CreateAccelTable(void)

{ //Масивакселераторов

ACCEL Accel[4];

// Старт

Accel[0].fVirt=FVIRTKEY|FCONTROL;

Accel[0].key=0x53;//"S"

Accel[0].cmd=IDM_START;

//Шлагбаум

Accel[1].fVirt=FVIRTKEY|FCONTROL;

Accel[1].key=0x57;// "W"

Accel[1].cmd=IDM_EDIT;

//Инфо

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 )

{

HACCEL hAccel=CreateAccelTable();

}

...

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

{

if (!TranslateAccelerator(hWnd,hAccel,&msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

DestroyAcceleratorTable(hAccel);

...

Для додання до проекту звуку потрібно зробити такі додаткові дії:

– Project  Setting  Link  Object&bsol;Library modules : winmm.lib

Для того, щоб грав звук потрібно написати таку функцію:

PlaySound (“train”, hInstance, SND_RESOURCE | SND_ASYNC)

Перший параметр відповідає за назву звуку.

2.6 Програмна реалізація роботи з шлагбаумом

Спочатку необхідно об’явити змінні, які будуть відповідати за рух машини та поїзда. Оскільки цих два об’єкти являють собою малюнки їх необхідно завантажити у ресурси, а потім завантажувати з ресурсів у програму.

Програмна реалізація зображення машини:

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

DrawTransparentBitmap(hdc, // кінцевий DC.

hBmpCar1, // Бітмап, який буде намальований

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

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

0x00FFFFFF); // Колір для прозорих

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

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

Програмна реалізація зображення поїзда:

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

DrawTransparentBitmap(hdc, // кінцевий DC.

hBmpTrain, // Бітмап, якийбуденамальований

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

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

0x00FFFFFF); // Колір для прозорих

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

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

Для того, щоб машина та поїзд рухались необхідно змінювати значення змінних X2 та Y2 – для машини, X – для поїзда (оскільки поїзд рухається горизонтально, координата Y залишається сталою), які відповідають за поточне місце на фоні . Над цією задачею працює таймер:

caseWM_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;

}

Для запуску таймера необхідно записати таку функцію:

int Speed=10;

…………….

SetTimer(hWnd,1,Speed,NULL);

Перший параметр вказує дескриптор вікна, другий – номер таймера, третій – швидкість. Останній пов’язаний з системою, за замовчуванням рівний нулю.

Шлагбаум теж потрібно намалювати:

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,hBmpShlagbaym,X3,Y3,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,hBmpShlagbaym,X3,Y3,0x00FFFFFF);

DeleteObject ( hBmpShlagbaym );

}

В залежності від змінної shlagbaym , шлагбаум знаходить або в опущеному або у піднятому стані.

При натисненні на «Керування Шлагбаумом» ­-­>«Підняти Шлагбаум» шлагбаум піднімається, і автомобіль продовжує рух, «Керування Шлагбаумом» -­>«Опустити Шлагбаум» шлагбаум опускається і автомобіль зупиниться, коли під`їде до нього. Щоб уникнути ДТП потрібно вчасно закрити шлагбаум, якщо не встигли – далі все залежить від випадку. Фрагмент коду, що описує все це наведемо нижче:

{

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;

}


3 Аналіз результатів роботи програми

Програмний продукт _-=Мій Курсовий Проект=-_ наглядно показує регулювання автомобільного руху через залізнодорожній переїзд, при використанні шлагбауму. Розроблений програмний продукт необхідно перевірити на конкретність роботи і підготувати інструкцію по роботі з ним.

3.1 Інструкція з технічного обслуговування

Вступ.

Дана інструкція призначена для технічного обслуговування програми, тобто встановлення її на комп’ютер та експлуатації.

Загальні вказівки.

Програма встановлюється на комп’ютер який відповідає вимогам технічних засобів поданих нижче.

Вимоги до технічних засобів.

Мінімальні системні вимоги:

– Pentium III 1.5ГГц;

– 128 MБ RAM;

– 12 MБ вільного місця на жорсткому диску;

– Вмонтована звукова карта;

– Windows ME, XP.

Рекомендовані системні вимоги:

– Pentium III 2.0 ГГц;

– 128 MБ RAM;

– 15 MБ вільного місця на жорсткому диску;