
- •2. Цикл обработки сообщений (GetMessage):
- •3. Оконная функция, назначение, параметры, обработка сообщений:
- •4. Структура оконного класса, поля, их назначение, инициализация:
- •5. Классы окон, регистрация оконного класса:
- •6. Создание экземпляра оконного класса:
- •7. Отображение окна на экране:
- •8. Управление положением и размерами окна:
- •9. Обновление оконной области на экране.
- •10. Установки фона.
- •11. Курсор приложения. Типы курсоров, их прикрепление к приложению.
БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Факультет Информационных Технологий и Робототехники
Кафедра «Программное обеспечение вычислительной техники и автоматизированных систем»
О Т Ч Е Т
по лабораторной работе № 1
дисциплина
«Системное программирование»
тема
«Простейшее приложение на базе WIN32/64 API»
Выполнил: студент гр.107329 Захаркевич С.Г.
Проверил: Разорёнов Н.А.
Минск 2011
Цель работы:
Изучить основы создания и управления окнами Windows-приложений на базе WIN32/64 API.
Изучаемые вопросы:
Архитектура WIN32/64 программы;
Цикл обработки сообщений (GetMessage);
Оконная функция, назначение, параметры, обработка сообщений;
Структура оконного класса, поля, их назначение, инициализация;
Классы окон, регистрация оконного класса;
Создание экземпляра оконного класса;
Отображение окна на экране;
Управление положением и размерами окна;
Обновление оконной области на экране;
Установки фона;
Курсор приложения. Типы курсоров, их прикрепление к приложению.
Постановка задачи:
Разработать приложение, в котором регистрируются оконные классы, создаются окна классов в соответствии с вариантом задания 5.



Жёлтый Зелёный Чёрный
Рис1. Начальное положение окон

C2
C1
С0
Рис.2 Иерархия окон
Ход работы:
1. Архитектура Win32-программы:
Win32 – программа содержит главную функцию _tWinMain(), в которой находятся функции MyRegisterClass(), MyRegisterClass1(), MyRegisterClass2() для регистрации класса и InitInstance() для создания окон. Так же в программе реализованы 3 оконные функции WndProc:
Рис.3 Архитектура Win32 – программы
2. Цикл обработки сообщений (GetMessage):
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg); // Преобразует сообщения, полученный с клавиатуры
DispatchMessage(&msg); // Отправляет сообщение оконной процедуре
}
}
Функция GetMessage извлекает сообщения типа MSG из очереди сообщений потока и отправляет их в соответствующую оконную функцию. Функция GetMessage извлекает сообщение из очереди и помещает его в указанную структуру типа MSG.
3. Оконная функция, назначение, параметры, обработка сообщений:
Оконная функция – это функция, которая контролирует внешний вид и поведение окна. В программе созданы 3 оконные процедуры WinProc, WinProc1, WinProc2. Создание окна:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // Для главного окна
LRESULT CALLBACK WndProc1(HWND hWnd1, UINT message, WPARAM wParam, LPARAM lParam)
// Для дочернего окна
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message) // конструкция switch-case используется для того, чтобы определить, какое сообщение получила оконная процедура
{
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);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Так же в дочерних окнах добавлена обработка нажатий кнопок мыши:
case WM_LBUTTONDOWN:
DestroyWindow(hWnd1);
break;
case WM_RBUTTONDOWN:
SetWindowPos(hWnd1, HWND_TOP, 0, 0, 1000, 400, SWP_NOMOVE);
break;
4. Структура оконного класса, поля, их назначение, инициализация:
Перед созданием окна необходимо инициализировать структуру оконного класса.
Структура WNDCLASSEX содержит атрибуты класса окна, который регистрируется с помощью функции RegisterClass1(). Ниже приведён пример структуры дочернего окна:
ATOM MyRegisterClass1(HINSTANCE hInstance)
{
WNDCLASSEX wcex1; // Определение структуры
wcex1.cbSize = sizeof(WNDCLASSEX); // Размер структуры
wcex1.style = CS_HREDRAW | CS_VREDRAW; // Стиль окна
wcex1.lpfnWndProc = WndProc1; // Указатель на процедуру окна
wcex1.cbClsExtra = 0; // Количество дополнительных байт для размещения структуры оконного класса
wcex1.cbWndExtra = 0; // Количество дополнительных байт для размещения экземпляра окна
wcex1.hInstance = hInstance; // Указатель на экземпляр окна
wcex1.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB_1)); // Дескриптор иконки
wcex1.hCursor = LoadCursor(NULL, IDC_IBEAM); // Дескриптор курсора
wcex1.hbrBackground = CreateSolidBrush(RGB(39,252,39)); // Дескриптор кисти фона окна
wcex1.lpszMenuName = MAKEINTRESOURCE(IDC_LAB_1); // Указатель на строку, содержащую имя меню, применяемую по умолчанию для этого класса
wcex1.lpszClassName = L"cl_1"; // Имя класса окна
wcex1.hIconSm = LoadIcon(wcex1.hInstance, MAKEINTRESOURCE(IDI_SMALL)); // Дескриптор маленькой иконки, ассоциированной с классом окна
return RegisterClassEx(&wcex1);
}