Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
System programming / Методические указания / Методичка к лабораторным работам (укр).doc
Скачиваний:
51
Добавлен:
08.05.2015
Размер:
230.4 Кб
Скачать

1 Структура windows - додатків. Віконна процедура. Обробка повідомлень

1.1 Мета роботи

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

1.2 Вказівки з підготовки до виконання лабораторної роботи

Необхідно вивчити принцип побудови та логіку роботи Windows-додатка, звернувши увагу на порядок створення додатка (формування структури класу вікна, реєстрація класу, написання віконної процедури, створення і відображення вікна, цикл обробки повідомлень).

При підготовці до роботи необхідно вивчити конспект лекцій зазазначеною темою зазначеній темі, методичні вказівки, а також розділи, зазначені в [16, c. 4-52], [17, c. 7-26].

    1. Суть роботи

Будь-який віконний додаток, написаний під Windows, повинен містити у собі такі елементи:

  1. Функцію реєстрації класу вікна.

  2. Функцію створення вікна.

  3. Віконну процедуру.

  4. Цикл обробки повідомлень.

Далі за текстом наводиться приклад найпростішої програми під Windows, що виводить на екран вікно додатка з написом "Привіт, світ! ". Дану програму необхідно взяти за основу при розв’язанні свого варіанта завдання. Програма містить усі необхідні для розуміння її роботи, коментар.

#include <windows.h> // підключення бібліотеки з функціями API

// Глобальні змінні:

HINSTANCE hInst; // Опис додатка

// Попередній опис функцій

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// Основна програма

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

MSG msg;

// Реєстрація класу вікна

MyRegisterClass(hInstance);

// Створення вікна додатка

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

// Цикл обробки повідомлень

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

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

// FUNCTION: MyRegisterClass()

// Реєструє клас вікна

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW; // стиль вікна

wcex.lpfnWndProc = (WNDPROC)WndProc; // віконна процедура

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance; // опис додатка

wcex.hIcon = MyIcon1; // визначення іконки

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

// визначення курсору

wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);

// установка фона

wcex.lpszMenuName = NULL; // визначення меню

wcex.lpszClassName = szWindowClass; // ім'я класу

wcex.hIconSm = NULL;

return RegisterClassEx(&wcex); // реєстрація класу вікна

}

// FUNCTION: InitInstance(HANDLE, int)

// Створює вікно додатка і зберігає покажчик додатка в змінній hInst

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // зберігає опис додатка в змінній hInst

hWnd=CreateWindow(szWindowClass, // им’я класу вікна

szTitle, // имя приложения

WS_OVERLAPPEDWINDOW, // стиль вікна

CW_USEDEFAULT, // положення по Х

CW_USEDEFAULT, // положення по Y

CW_USEDEFAULT, // розмір по Х

CW_USEDEFAULT, // розмір по Y

NULL, // опис батьківського вікна

NULL, // опис меню вікна

hInstance, // покажчик додатка

NULL); // параметри створення .

if (!hWnd) // Якщо вікно не створилося, функція повертає FALSE

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow); // Показати вікно

UpdateWindow(hWnd); // Оновити вікно

return TRUE; //Успішне завершення функції

}

// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)

// Віконна процедура. Приймає й опрацьовує усі

// повідомлення, що надходять у додаток

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

RECT rt;

switch (message)

{

case WM_CREATE: // Повідомлення надходить при створенні вікна

break;

case WM_PAINT: // Перерисувати вікно

hdc = BeginPaint(hWnd, &ps); // Почати графічний вивід

GetClientRect(hWnd, &rt); // Область вікна для рисування

DrawText(hdc, "Привіт, світ! ", -1, &rt,

DT_SINGLELINE|DT_CENTER | DT_VCENTER);

EndPaint(hWnd, &ps); // Закінчити графічний вивід

break;

case WM_DESTROY: // Завершення роботи

PostQuitMessage(0);

break;

default:

// Обробка повідомлень, що не оброблені користувачем

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

Особливу увагу в першій лабораторній роботі треба приділити використанню функцій реєстрації, створенню вікна та віконній процедурі. Докладний опис параметрів цих функцій можна дізнатися за допомогою MSDN або Win32 Programmer's Reference, установлених на робочих місцях.

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