СП лекция-01ua

Содержание

Слайд 2

Тема лекції: Архітектура Windows- додатку

Л е к ц і я № 1 по курсу "Системне

Тема лекції: Архітектура Windows- додатку Л е к ц і я №
програмування "

Змістовний модуль № 1: Системне програмування в Wındows

04.09.2021

Лектор:
Доцент кафедри Інформаційних систем
кандидат технічних наук, доцент
Голубничий Дмитро Юрійович

Слайд 3

Література

Література

Слайд 4

НАВЧАЛЬНІ ПИТАННЯ:

НАВЧАЛЬНІ ПИТАННЯ:

Слайд 5

1. Ініціалізація програми

1. Ініціалізація програми

Слайд 6

Вікно - це об'єкт, атрибути якого (тип, розмір, положення на екрані, вид

Вікно - це об'єкт, атрибути якого (тип, розмір, положення на екрані, вид
курсора, меню, значок, заголовок) повинні бути спочатку сформовані, а потім зареєстровані системою

З точки зору програміста

Вікно - в більшості випадків кінцевий пункт, яким направляються повідомлення

Вікно - це прямокутна область екрану, яка відповідає будь-якому застосунку або його частини

З точки зору користувача

З точки зору операційної системи

Слайд 7

Етап 2

Етап 1

ПРОГРАМУВАННЯ ЗАСТОСУНКУ

Ініціалізація:

1. Створення класу вікон із

Етап 2 Етап 1 ПРОГРАМУВАННЯ ЗАСТОСУНКУ Ініціалізація: 1. Створення класу вікон із
заданими характеристиками

2. Реєстрація віконного класу в Windows

3. Створення головного (батьківського) вікна класу

5. Вхід до циклу повідомлень

Обробка повідомлень в віконної процедури

WinMain()

Функції та структури:

RegisterClass()

RegisterClassEx()

WNDCLASS

WNDCLASSEX

CreateWindow()

CreateWindowEx()

4. Показ і оновлення вікна на екрані

ShowWindow()

UpdateWindow()

MSG

GetMessage()

TranslateMessage()

DispatchMessage()

WndProc()

DestroyWindow()

DefWindowProc()

PostQuit-Message()

Слайд 8

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

ФУНКЦІЇ

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) ФУНКЦІЇ

ATOM RegisterClass (CONST WNDCLASS * lpwc)

ATOM RegisterClassEx (CONST WNDCLASSEX * lpwc)

HWND CreateWindow(LPCTSTR lpszAppName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu, HINSTANCE hInstance, LPVOID lpvParam);

BOOL ShowWindow (HWND hwnd, int nCmdShow)

BOOL UpdateWindow (HWND hwnd)

BOOL GetMessage (LPMSG lpmsg, HWND hWnd, UINT uMsgFilterMin, UINT uMsgFilterMax)

BOOL TranslateMessage (CONST MSG * lpMsg)

LRESULT DispatchMessage (CONST MSG * lpMsg)

Слайд 9

СТРУКТУРИ

typedef struct MSG
{
HWND hwnd / * Дескриптор вікна
UINT massge / * Ідентифікатор

СТРУКТУРИ typedef struct MSG { HWND hwnd / * Дескриптор вікна UINT
повідомлення
WPARAM wParam / * 32-розрядне значення wParam, що передаються функції WndProc ()
LPARAM lParam / * 32-розрядне значення lParam, що передаються функції WndProc ()
DWORD time / * Число мілісекунд з моменту запуску
POINT pt / * Положення курсора миші
}

typedef struct WNDCLASS
{
UINT style; / *стиль вікна
WNDPROC lpfnWndProc; / *покажчик на функцію обробки повідомлень
int cbClsExtra; / *число додаткових байт в кінці структури
int cbWndExtra; / *число додаткових байт за вікном
HINSTANCE hInstance; / *дескриптор додатки
HICON hIcon; / *дескриптор піктограми
HCURSOR hCursor; / *дескриптор курсора
HBRUSH hbrBackground; / *дескриптор кисті
LPCSTR lpszMenuName; / *покажчик на рядок з ім'ям меню
LPCSTR lpszClassName; / * Покажчик на рядок з ім'ям класу вікна
}

Слайд 10

2. Обробка повідомлень

2. Обробка повідомлень

Слайд 11

Шлях проходження повідомлень в Windows

Шлях проходження повідомлень в Windows

Слайд 12

Шлях проходження повідомлень в Windows

Шлях проходження повідомлень в Windows

Слайд 13

Відбувається апаратна подія

Системна черга повідомлень

Планувальник системи

Черга повідомлень процесу 1

Функція перехоплення повідомлень процесу

Відбувається апаратна подія Системна черга повідомлень Планувальник системи Черга повідомлень процесу 1
1

GetMassage ()
TranslateMessage ()
DispatchMessage ()

WndProc ()

DefWindowProc ()

Черга повідомлень процесу 2

GetMassage ()
TranslateMessage ()
DispatchMessage ()

DefWindowProc ()

Черга повідомлень процесу 3

GetMassage ()
TranslateMessage ()
DispatchMessage ()

DefWindowProc ()

Послідовність обробки повідомлень в Windows

WndProc ()

WndProc ()

Функція перехоплення повідомлень процесу 2

Функція перехоплення повідомлень процесу 3

Слайд 14

Внутрішня структура віконної процедури:

Віконна процедура (WndProc) - це процедура зворотного виклику (CALLBACK),

Внутрішня структура віконної процедури: Віконна процедура (WndProc) - це процедура зворотного виклику
яка обробляє повідомлення, надіслані їй Windows.

LRESULT CALLBACK WndProc (HWND hWnd, UINT massage, WPARAM wParam, LPARAM lParam)
{
switch (massage)
{
case WM_PAINT:
// ====== Обробка повідомлення WM_PAINT:
return 0;
case WM_DESTROY:
// ====== Обробка повідомлення WM_DESTROY:
PostQuitMessage(0) /* функція, яка виставляє повідомлення WM_QUIT, Вказуючи на завершення виконання процесу */.
return 0;
default:
return (DefWindowProc (hWnd, massage, wParam, lParam));
}
}

Макрос: HANDLE_MSG (HWnd, message, fn);

Слайд 15

3.Файл ресурсів

3.Файл ресурсів

Слайд 17

CURSOR

BITMAP

Однорядкові описувачі ресурсу

файл ресурсу (*.rc)

файл програми (*. cpp)

ICON

BITMAPNAME BITMAP

CURSOR BITMAP Однорядкові описувачі ресурсу файл ресурсу (*.rc) файл програми (*. cpp)
"BITMAPFILE.BMP"

HBITMAP LoadBitmap (HINSTANCE hInst, LPCTSTR lpszBitmap);

CURSORNAME CURSOR "CURSORFILE.CUR"

HCURSOR LoadCursor (HINSTANCE hInst, LPCTSTR lpszCursor);

ICONNAME ICON "ICONFILE.ICO"

HICON LoadIcon (HINSTANCE hInst, LPCTSTR lpszIcon);

файл програми (*. cpp)

файл ресурсу (*.rc)

файл ресурсу (*.rc)

файл програми (*. cpp)

BOOL DeleteObject (HGDIOBJ hGdiObject);

Видалення об'єкта

Слайд 18

Багаторядкові описувачі ресурсу

Багаторядкові описувачі ресурсу

Слайд 19

4.Меню застосунку

4.Меню застосунку

Слайд 21

Багаторядкові описувачі ресурсу

файл ресурсу (*.rc)

MenuName MENU [Параметри] // це - головне меню
{

Багаторядкові описувачі ресурсу файл ресурсу (*.rc) MenuName MENU [Параметри] // це -

// Опис усіх popup-меню і елементів меню другого рівня
}

POPUP "Ім'я" [, Параметри] // - опис popup-меню
{
// Опис усіх popup-меню і елементів чергового рівня
}

MENUITEM "Ім'я", MenuID [, Параметри]

1. Багаторівнева деревоподібна структура меню

2. Спливаючі меню

3. Кінцевий елемент меню

Примітка. Якщо замість імені меню вікна записано слово SEPARATOR (без лапок), на місці елемента меню з'являється горизонтальна лінія

WndClass.lpszMenuName = " MenuName "

4. Додавання посилання на ім'я меню в структурі WNDCLASS

Статичне меню (з використанням файлу ресурсів)

Слайд 22

Багаторядкові описувачі ресурсу

Статичне меню (з використанням файлу ресурсів)

Параметри, що описують елемент

Багаторядкові описувачі ресурсу Статичне меню (з використанням файлу ресурсів) Параметри, що описують
меню в файлі ресурсів

Слайд 23

Багаторядкові описувачі ресурсу

Наприклад. Спробуємо створити опис невеликого меню.
Горизонтальне меню дозволить вибирати

Багаторядкові описувачі ресурсу Наприклад. Спробуємо створити опис невеликого меню. Горизонтальне меню дозволить
підміню "File", "Examples" І кінцевий елемент "Help".
Підменю"File" буде містити елементи "Open" І "Exit", що розділені горизонтальною лінією, а підміню"Examples"- кілька кінцевих елементів.

MyMenu MENU
{
POPUP "& File"
{
MENUITEM "& Open", 101
MENUITEM SEPARATOR
MENUITEM "E & xit", 102
}
POPUP "& Examle"
{
POPUP "Example1"
{
MENUITEM "1 & 1", 103
MENUITEM "1 & 2", 104
}
POPUP "Example2"
{
MENUITEM "2 & 1", 105
MENUITEM "2 & 2", 106
}
}
MENUITEM "& Help", 111
}

Статичне меню (з використанням файлу ресурсів)

Слайд 25

Багаторядкові описувачі ресурсу

Контекстне меню

Для відображення і вибору рядків контекстного меню

BOOL TrackPopupMenu

Багаторядкові описувачі ресурсу Контекстне меню Для відображення і вибору рядків контекстного меню
(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hwnd, CONST RECT *prcRect);

Слайд 26

5.Повідомлення меню

5.Повідомлення меню

Слайд 27

ПОВІДОМЛЕННЯ МЕНЮ

WM_MENUSELECT

wParam

якщо підсвічений елемент є кінцевим і не тягне за

ПОВІДОМЛЕННЯ МЕНЮ WM_MENUSELECT wParam якщо підсвічений елемент є кінцевим і не тягне
собою виклик popup-меню, то містить ідентифікатор елемента меню

Характеристики підсвіченого елемента меню (Код нотифікації)

lParam

Формується при зміні підсвіченого елемента меню покажчиком миші

якщо підсвічений елемент при виборі тягне за собою виклик popup-меню, то містить номер (індекс) цього елемента в тому меню, в якому воно знаходиться

Слайд 28

ПОВІДОМЛЕННЯ МЕНЮ

WM_COMMAND

wParam

lParam

ідентифікатор обраного елемента меню

дорівнює нулю (що означає від

ПОВІДОМЛЕННЯ МЕНЮ WM_COMMAND wParam lParam ідентифікатор обраного елемента меню дорівнює нулю (що
меню)

WM_SYSCOMMAND

wParam

lParam

x - кооpдіната курсора миші;
0 - якщо миша не використовується

y - кооpдіната курсора миші;
0 - якщо миша не використовується

Формується при виборі (натисканні клавіші "Enter") звичайного пункту меню

Формується при виборі (натисканні клавіші "Enter") пункту системного меню

Слайд 29

ПОВІДОМЛЕННЯ МЕНЮ

WM_INITMENUPOPUP

wParam

lParam

хендл підміню

індекс спливаючого меню в меню верхнього рівня

1

ПОВІДОМЛЕННЯ МЕНЮ WM_INITMENUPOPUP wParam lParam хендл підміню індекс спливаючого меню в меню
- системне меню;
0 - звичайне меню.

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

WM_INITMENU

wParam

lParam

не використовується

хендл меню

Примітка. Це повідомлення надсилається при натисканні кнопки миші в рядку меню або при натисканні клавіші меню

Формується перед відображенням головного вікна

Формується перед відображенням спливаючого меню

Слайд 30

ФУНКЦІЇ ДЛЯ УПРАВЛІННЯ МЕНЮ

BOOL EnableMenuItem (HMENU hMenu, UINT uItem, UINT uFlags);

BOOL

ФУНКЦІЇ ДЛЯ УПРАВЛІННЯ МЕНЮ BOOL EnableMenuItem (HMENU hMenu, UINT uItem, UINT uFlags);
ModifyMenu (HMENU hMenu, UINT uItem, UINT uFlags, UINT uNewItem, LPCTSTR lpszNewItem);

Видалення елемента з меню і звільнення всіх пов'язаних з ним ресурсів

BOOL DeleteMenu (HMENU hMenu, UINT uPosition, UINT uFlags);

Видалення елемента з меню без звільнення всіх пов'язаних з ним ресурсів

BOOL RemoveMenu (HMENU hMenu, UINT uPosition, UINT uFlags) ;

Повне видалення (руйнування) меню

BOOL DestroyMenu (HMENU hMenu) ;

Повертає хендл головного меню вікна

HMENU GetMenu (HWND hWnd) ;

Повертає хендл спливаючого меню

HMENU GetSubMenu (HMENU hMenu, int nPos) ;

Зміна стану елемента пункту меню

Зміна напису елемента пункту меню

Слайд 31

РЯДОК СТАНУ

Функції для роботи з рядком стану оголошені у файлі commctrl.h

#pragma comment

РЯДОК СТАНУ Функції для роботи з рядком стану оголошені у файлі commctrl.h
(lib, "comctl32.lib")

void InitCommonControls (VOID);

HWND CreateStatusWindow(LONG style, LPCTSTR lpszText, HWND hwndParent, UINT wID);

Ініціалізація бібліотеки загальних елементів управління

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

Слайд 32

6. Акселератори

6. Акселератори

Слайд 33

Комбінації клавіш, які при натисканні автоматично вибирають відповідний їм елемент меню (навіть

Комбінації клавіш, які при натисканні автоматично вибирають відповідний їм елемент меню (навіть
в тих випадках, коли воно не активно і не відображається), називаються акселераторами.

TableName ACCELERATORS
{Keyl, MenuIDl [,тип] [,параметр]
. . . . . .
Keyn, MenuIDn [,тип] [, параметр]
}

Віртуальна клавіша - це системно-незалежний код, визначений для основного набору службових клавіш.

файл ресурсу (*.rc)

Несистемною клавішею називається будь-яка клавіша, що натискається без одночасно натискання клавіші Alt.

Слайд 34

HACCEL LoadAccelerators (HINSTANCE hInst, LPCTSTR lpszTableName);

int TranslateAccelerator (HWND hWnd, HACCEL hAccTable,

HACCEL LoadAccelerators (HINSTANCE hInst, LPCTSTR lpszTableName); int TranslateAccelerator (HWND hWnd, HACCEL hAccTable,
LPMSG lpMsg);

Файл програми (*. cpp)

while (GetMessage (& msg, NULL, 0, 0))
{
if (! Accel ||! TranslateAccelerator (hWnd, hAcc, & msg);
{
TranslateMessage (& msg);
DispatchMessage (& msg);
}
}

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

Завантаження таблиці акселераторів з файлу ресурсів

Переклад акселеpатоp клавіатура (wm_KeyUp, wm_KeyDown) в повідомлення команд меню

Имя файла: СП-лекция-01ua.pptx
Количество просмотров: 27
Количество скачиваний: 0