Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Захаркевич_лаб1_СПО.docx
Скачиваний:
7
Добавлен:
13.07.2019
Размер:
109.12 Кб
Скачать

БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет Информационных Технологий и Робототехники

Кафедра «Программное обеспечение вычислительной техники и автоматизированных систем»

О Т Ч Е Т

по лабораторной работе № 1

дисциплина

«Системное программирование»

тема

«Простейшее приложение на базе WIN32/64 API»

Выполнил: студент гр.107329 Захаркевич С.Г.

Проверил: Разорёнов Н.А.

Минск 2011

Цель работы:

Изучить основы создания и управления окнами Windows-приложений на базе WIN32/64 API.

Изучаемые вопросы:

  1. Архитектура WIN32/64 программы;

  2. Цикл обработки сообщений (GetMessage);

  3. Оконная функция, назначение, параметры, обработка сообщений;

  4. Структура оконного класса, поля, их назначение, инициализация;

  5. Классы окон, регистрация оконного класса;

  6. Создание экземпляра оконного класса;

  7. Отображение окна на экране;

  8. Управление положением и размерами окна;

  9. Обновление оконной области на экране;

  10. Установки фона;

  11. Курсор приложения. Типы курсоров, их прикрепление к приложению.

Постановка задачи:

Разработать приложение, в котором регистрируются оконные классы, создаются окна классов в соответствии с вариантом задания 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);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]