
- •Аналіз сучасного стану питання та обгрунтування завдання на роботу
- •Предметна область
- •Існуючі реалізації
- •1.3 Розробка технічного завдання на роботу
- •1.4 Обгрунтування вибор умови програмування
- •2 Розробка інтерфейсу програми та прикладів використання
- •2.1 Розробка інтерфейсу програми
- •2.2 Приклади використання
- •3 Розробка діаграм класів
- •4 Розробка підсистеми графічного відображення
- •4.1 Модель графічного відображення
- •4.2 Графічні процедури підсистеми графічного відображення
- •ФункціяLoadImage:
- •5 Використання засобів програмування winapi
- •6 Розробка підсистеми серіалізації/десеріалізації даних
- •6.1 Розробка формату файлу
- •7 Керівництво користувача
- •7.1 Встановлення програми та необхідні файли/каталоги
- •7.2 Запуск програми
- •7.3 Користувацький інтерфейс
7 Керівництво користувача
7.1 Встановлення програми та необхідні файли/каталоги
Скопіювати в цільовий каталог файли: «LAB1.exe», «water.bmp», «Microb GRADE1 RUN.bmp», «Microb GRADE1.bmp», «Microb GRADE2 RUN.bmp», «Microb GRADE2.bmp», «Microb GRADE3 RUN.bmp», «Microb GRADE3.bmp».
7.2 Запуск програми
Для коректної роботи программи необхідно зберігати у одному каталозі із *.exe файлом наступні файли:
«Water.bmp»
«Microb GRADE1 RUN.bmp»
«Microb GRADE1.bmp»
«Microb GRADE2 RUN.bmp»
«Microb GRADE2.bmp»
«Microb GRADE3 RUN.bmp»
«Microb GRADE3.bmp»
У випадку переміщення цих файлів або зміни їхньго імені правильна робота програми не гарантуєтся. Не рекомендуєтся вносити зміни у зміст файлів, правильна робота програми не гарантуєтся.
Щоб запустити программу виконайте *.exeфайл.
7.3 Користувацький інтерфейс
Робота із програмою починаєтся із стандартними налаштуваннями, які включають в себе аудиторію, студентів та деканат(рис. 7.1).
Рисунок 7.1 – Початок роботи програми
Для того, щоб змусити студентів рухатись, їх необхідно виділити. Для виділення студента кликніть по ньому лівою кнопкою миші. Виділені студенти обведені рамкою (рис. 7.2). Є можливість виділення декількох студентів.
Рисунок 7.2 – Виділення студентів
Після виділення, студентом можна рухати: студента в аудиторії можна рухати стрілочками, у воді клавішами w/s.
Студенти, що містяться у деканаті будуть автоматично рухатись вправо по треку відповідно до своїх можливостей.
Для видалення студента, виділіть його і натисніть клавішу delete. Будьте уважні, ця команда видаляє усі виділені об’єкти .
Щоб додати нового студента, натисніть клавішу Insert заповніть поля «Ім’я» та «Швидкість», оберіть тип студента і натисніть «Ок» (рис. 7.3). Новий студент з’явится у випадковому місці на робочій поверхні. Для швидкого створення студентів використовуйте клавіші 1/2/3.
Рисунок 7.3 – Діалогове вікно створення нового студента
ВИСНОВКИ
У ході розробки курсової роботи було визначено основні проблеми які стосуються обраної теми, розглянуто основні питання пов’язані з нею проаналізовано життя, та навчання студентів . Було досліджено різницю між мовами програмування С++, С# та Java і обрано С++, як мову, яка найкраще підходить для реалізації програми. Обрано WinAPI , як найбільш актуальну та вдалу форму розробки програми. Було вивчено базові принципи об’єктно-орієнтованого програмування, ієрархію класів, принципи поліморфізму, інкапсуляції, наслідування. Отримано основні навички та знання необхідні при роботі у WinAPI.
ПЕРЕЛІК ПОСИЛАНЬ
1. С.Прата. Язык программироваия С++. Лекции и упражнения, 6-е изд.:Пер. С англ.. – М.:ООО «И.Д.Вильямс», 2012. – 1248 с.
2. Isaac Azimov. I, Robot - NY.:Spectra, 1991. – 304 c.
3. Ч. Петзолд. Программирование для Windows 95. Том I. - Санкт – Петербург: BHV, 1997.- 495 c.
4. Шеховцов В. А. Операційні системи. – К.:Видавнича група BHV, 2005. – 576 c.
5. Страуструп, Бьярне. Макросы // Программирование: Принципы и практика использования C++ = Programming: Principles and Practice Using C++. — М.: ООО «И.Д. Вильямс», 2001. — С. 1065, 1066, 1133. — 1248 с.
ДОДАТКИ
Додаток А
Лістинг модуля student.cpp
#include "stdafx.h"
#include "student.h"
#include "class.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_STUDENT, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_STUDENT));
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_STUDENT));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_STUDENT);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
int n=10;
int j=-1;
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool first = true;
int i0,x=0,y=0;
if(first){
first=false;
arr = new student *[n];
for(int i=0;i<n;i++)
arr[i]= new student();
}
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_LBUTTONDOWN:{
int mx=LOWORD(lParam);
int my=HIWORD(lParam);
for(int i=0;i<n;i++)
arr[i]->activ(mx,my);
::InvalidateRect(hWnd, NULL, true );
}break;
case WM_KEYDOWN:{
switch(wParam)
{
case VK_ESCAPE:
for(int j=0;j<n;++j)
arr[j]->esc();break;
case VK_UP:
for(int i=0;i<n;++i)
arr[i]->ruh("y",-5);
break;
case VK_DOWN:
for(int i=0;i<n;++i)
arr[i]->ruh("y",5);;
break;
case VK_LEFT:
for(int i=0;i<n;++i)
arr[i]->ruh("x",-5);;
break;
case VK_RIGHT:
for(int i=0;i<n;i++)
arr[i]->ruh("x",5);;
break;
case VK_DELETE:{
for(int i=0;i<n;i++)
if(arr[i]->ret()==true)j=i;
if(j!=-1){
for(int i=j;i<n-1;++i)arr[i]=arr[i+1];
n--;j=-1;}
}
break;
}
::InvalidateRect(hWnd,NULL,true);
}break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
for(int i=0;i<n;i++)
arr[i]->DRAW(hdc);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
Додаток Б
Лістинг модуля student2.cpp
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace System;
class Student
{
public:
int serBal, rik_naroj;
float znannia_mov, weight;
char Name[50];
int *referen;
void Zdawses();
Student operator-- ()
{
rik_naroj--;
return (*this);
}
Student(int riknar, int serbal, float znmov)
{
referen = new int[2];
referen[1]=4+serbal;
referen[0]=riknar * 5;
printf ("\nKonstruktor vuklukano:\nVvedit' imya studenta z poperednimu parametramu:\n");
rik_naroj=riknar;
znannia_mov=znmov;
serBal=serbal;
gets(Name);
weight=0.4F;
}
Student & operator= (Student &arg )
{
if( this == &arg ) return (*this);
delete []referen;
referen = new int[2];
referen[0] = arg.referen[0];
referen[1] = arg.referen[1];
int le=strlen(Name),
len2=strlen(arg.Name),
kc=(le>len2)?le:len2;
for( int i=0; i<kc; i++ )
{
if(i<le)
Name[i]=arg.Name[i];
else
Name[i]='\0';
}
return (*this);
}
Student()
{
}
Student( const Student & arg )
{
serBal=arg.serBal;
rik_naroj=arg.rik_naroj;
znannia_mov=arg.znannia_mov;
int le=strlen(Name),
len2=strlen(arg.Name),
kc=(le>len2)?le:len2;
for( int i=0; i<kc; i++ )
{
if(i<le)
Name[i]=arg.Name[i];
else
Name[i]='\0';
}
referen = new int[2];
referen[0] = arg.referen[0];
referen[1] = arg.referen[1];
}
void about()
{
printf("student %s %i %.1f %i ",this->Name,rik_naroj,znannia_mov,serBal);
}
void about(short ll)
{
printf("student %s %i %.1f %i ((%i %i)\n",this->Name,rik_naroj+100,znannia_mov,serBal,ll<<3,!ll);
}
friend Student operator*( Student &o1, Student &o2 );
};
void Student::Zdawses()
{
}
Student operator*( Student &o1, Student &o2 )
{
Student tmp( o1.rik_naroj*o2.rik_naroj, o1.znannia_mov*o2.znannia_mov, o1.serBal+o2.serBal );
return tmp;
}
int main(array<System::String ^> ^args)
{
char vybMas='1', juven;
int kolic1=0, kolic2=0, kilk, indeks, i;
printf("Vvedy kilkist obyektiv :>");
kilk = Convert::ToInt32(Console::ReadLine());
int jj=9;
Student *typ1 = new Student[kilk], **typ2 = new Student*[kilk];
bak:
switch(getch())
{
case 'l':
printf("Masyv obyektiv\n");
if(vybMas=='1')
{
for(i=0;i<kolic1;i++)
{
typ1[i].about();
typ1[i].Zdawses();
puts("");
}
}
else
{
for(i=0;i<kolic2;i++)
{
typ2[i]->about();
typ2[i]--;
puts("");
}
}
break;
case 'x':
goto end_g;
case 's'://сортувати
printf("Vvedy '1' dlia sort. po movah '3' dlia sortuvannia poci narojen\n");
bk: juven=getch();
if(juven!='1' && juven!='3')
goto bk;
int j;
if(vybMas=='1')
{
for(i=0;i<kolic1;i++)
for(j=1;j<kolic1;j++)
if(juven=='1' && typ1[j].znannia_mov<typ1[j-1].znannia_mov || juven=='3' && typ1[j].rik_naroj<typ1[j-1].rik_naroj)
{
Student YYy = typ1[j];
typ1[j] = typ1[j-1];
typ1[j-1]=YYy;
}
}
else
{
for(i=0;i<kolic2;i++)
for(j=1;j<kolic2;j++)
if(juven=='1' && typ2[j]->znannia_mov<typ2[j-1]->znannia_mov || juven=='3' && typ2[j]->rik_naroj<typ2[j-1]->rik_naroj)
{
Student *YYy = typ2[j];
typ2[j] = typ2[j-1];
typ2[j-1] = YYy;
}
}
break;
case 'i':
if(kilk>0)
{
Student kkk (typ1[kilk-1]);
jj=kkk.rik_naroj*3;
}
printf("Vvedy pozyciyu elementu i vin vyvedeccia %i\n",jj);
indeks = Convert::ToInt32(Console::ReadLine());
if(vybMas=='1')
{
if(indeks>=kolic1) break;
typ1[indeks].about();
Student k (typ1[indeks]);
}
else
{
if(indeks>=kolic2) break;
typ2[indeks]->about(28);
}
puts("");
break;
case 'd':
printf("\nVvedy pozyciyu elementa yaky hoch vydalyty\n");
indeks = Convert::ToInt32(Console::ReadLine());
if(vybMas=='1')
{
for(i=indeks;i<kolic1;i++)
typ1[i] = typ1[i+1];
kolic1--;
}
else
{
for(i=indeks;i<kolic2;i++)
typ2[i] = typ2[i+1];
kolic2--;
}
break;
case 'a':
int a1,a2; float a3;
if(kolic1==kilk && vybMas=='1' || kolic2==kilk && vybMas=='2')
break;
printf("Vvedy pozyciyu v masyvi kudy vstavyty obyekt\n");
indeks = Convert::ToInt32(Console::ReadLine());
a3 = Convert::ToSingle(Console::ReadLine());
a2 = Convert::ToInt32(Console::ReadLine());
a1 = Convert::ToInt32(Console::ReadLine());
if(vybMas=='2')
{
for(i=kolic2;i>indeks;i--)
typ2[i] = typ2[i-1];
typ2[indeks] = new Student(a1,a2,a3);
kolic2++;
}
else
{
for(i=kolic1;i>indeks;i--)
{
if(i%3==2)
{
Student aa1 (typ1[i-1]);
printf(" %i\n",aa1.rik_naroj);
}
typ1[i] = typ1[i-1];
}
typ1[indeks].rik_naroj=a1;
typ1[indeks].serBal=a2;
typ1[indeks].znannia_mov=a3;
kolic1++;
}
break;
case 'f':
printf("\nVybery typ masyvu >");
bck:
vybMas=getch();
if(vybMas!='1'&&vybMas!='2') goto bck;
printf("\nVybrany masyv %c typu", vybMas);
break;
}
goto bak;
end_g:
delete(typ1);
delete(typ2);
return 0;
}
Додаток В
Лістинг модуля student3.cpp
#include "StdAfx.h"
#include "student.h"
HBITMAP bmpExercising;
student **arr=0;
int MAX=0;
int W=0;
int H=0;
student::student()
{
x=0;
y=0;
active=false;
}
student::~student()
{
}
student student::operator-- ()
{
kilkist_rokiv--;
return (*this);
}
student & student::operator= (student &arg )
{
if( this == &arg ) return (*this);
int le=strlen(Name),
len2=strlen(arg.Name),
kc=(le>len2)?le:len2;
for( int i=0; i<kc; i++ )
{
if(i<le)
Name[i]=arg.Name[i];
else
Name[i]='\0';
}
x=arg.x;
y=arg.y;
active=arg.active;
return (*this);
}
student::student( const student & arg )
{
vozrast=arg.vozrast;
rist=arg.rist;
vaga=arg.vaga;
int le=strlen(Name),
len2=strlen(arg.Name),
kc=(le>len2)?le:len2;
for( int i=0; i<kc; i++ )
{
if(i<le)
Name[i]=arg.Name[i];
else
Name[i]='\0';
}
x=arg.x;
y=arg.y;
active=arg.active;
}
student::student(char *name,int vaga, int vik, float rist,int _vozrast)
{
vik=vik;
vaga=vaga;
vozrast=_vozrast;
strcpy(Name,name);
vaga=0.4F;
x=rand()%500;
y=rand()%500;
active=false;
}
bool student::is_whithin(int mx,int my)
{
if(mx<x||mx>x+W||my<y||my>y+H)return false;
return true;
}
void student::draw(HDC hdc)
{
HDC cDC=CreateCompatibleDC(hdc);
HBITMAP old=(HBITMAP)SelectObject(cDC,bmpExercising); // bitmap=LoadBitmap(hMod,MAKEINTRESOURCE(BIT2)); - загружается из ресурсов dll
if(active)
{
::Rectangle(hdc,x-5,y-5,x+W+5,y+H+5);
}
StretchBlt( hdc,x,y,W,H,cDC,0,0, W, H, SRCCOPY);
SelectObject(cDC,old);
DeleteDC(cDC);
::TextOutA(hdc,x,y+H+5,(LPCSTR)Name,strlen(Name));
::MoveToEx(hdc,x,y+H+5,0);
::LineTo(hdc,x+W,y+H+5);
}
Додаток Г
Лістинг модуля student4fin.cpp
#include "stdafx.h"
#include "lab3.h"
#include "student.h"
#include <ctime>
#define MAX_LOADSTRING 100
// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
// Отправить объявления функций, включенных в этот модуль кода:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;
// Инициализация глобальных строк
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_LAB3, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB3));
// Цикл основного сообщения:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
void addStud(student * d)
{
student **tmp=new student*[MAX+1];
for(int i=0;i<MAX;++i)tmp[i]=arr[i];
tmp[MAX]=d;
delete [] arr;
arr=tmp;
++MAX;
}
void MoveArr(int dx,int dy)
{
for(int i=0;i<MAX;++i)
{
if(!arr[i]->active)continue;
arr[i]->x+=dx;
arr[i]->y+=dy;
}
}
void DeleteArr()
{
student **tmp=new student *[MAX];
int k=0;
for(int i=0;i<MAX;++i)
{
if(arr[i]->active)
{
delete arr[i];
continue;
}
tmp[k]=arr[i];
++k;
}
delete [] arr;
MAX=k;
arr=new student *[MAX];
for(int i=0;i<MAX;++i)arr[i]=tmp[i];
delete [] tmp;
}
void DiselectArr()
{
for(int i=0;i<MAX;++i)arr[i]->active=false;
}
//
// ФУНКЦИЯ: MyRegisterClass()
//
// НАЗНАЧЕНИЕ: регистрирует класс окна.
//
// КОММЕНТАРИИ:
//
// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
// был совместим с системами Win32, не имеющими функции RegisterClassEx'
// которая была добавлена в Windows 95. Вызов этой функции важен для того,
// чтобы приложение получило "качественные" мелкие значки и установило связь
// с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB3));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_LAB3);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
// КОММЕНТАРИИ:
//
// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
// создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
//
// WM_COMMAND - обработка меню приложения
// WM_PAINT -Закрасить главное окно
// WM_DESTROY - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static int first_flag=0;
if( first_flag == 0 )
{
first_flag = 1;
srand(time(0));
bmpExercising = (HBITMAP)LoadImage( hInst ,L"student .bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION ) ;
BITMAP b;
GetObject(bmpExercising, sizeof(BITMAP), &b);
W=b.bmWidth;
H=b.bmHeight;
arr=new student *[5];
MAX=5;
for(int i=0;i<MAX;++i)
{
arr[i]=new student ("trololo");
}
}
int dx=0,dy=0;
switch (message)
{
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_LEFT:
{
dx=-step;
}break;
case VK_RIGHT:
{
dx=step;
}break;
case VK_UP:
{
dy=-step;
}break;
case VK_DOWN:
{
dy=step;
}break;
case VK_INSERT:
{
student * s=new student ("ololo");
addStud (d);
}break;
case VK_DELETE:
{
DeleteArr();
}break;
case VK_ESCAPE:
{
DiselectArr();
}break;
}
MoveArr(dx,dy);
::InvalidateRect(hWnd, NULL, true );
}break;
case WM_LBUTTONDOWN:
{
for(int i=0;i<MAX;++i)
{
if(arr[i]->is_whithin(LOWORD(lParam), HIWORD(lParam)))
{
if(arr[i]->active)
{
arr[i]->active=false;
}
else
{
arr[i]->active=true;
}
}
}
::InvalidateRect(hWnd, NULL, true );
}break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
// TODO: добавьте любой код отрисовки...
for(int i=0;i<MAX;++i)arr[i]->draw(hdc);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
{
for(int i=0;i<MAX;++i)delete arr[i];
delete [] arr;
PostQuitMessage(0);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}