Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Структура тексту додатку
Структура тексту додатку визначається двома вимогами: 1. Текст містить опис функції з іменем WinMain; 2. Якщо реєструються нові класи, то текст містить опис структури типу WNDCLASS і функцій вікон цих класів. Наступний додаток (лістинг 1.1) реєструє клас вікон, що перекриваються, створює вікно цього класу і передає управління циклу обробки повідомлень. Проект додатку містить декілька частин. 1. В окремому файлі (Functions.cpp) описано функцію RegClass. Текст файлу Functions.cpp: #include “Functions.h” BOOL RegClass (WNDPROC Proc, LPCTSTR szName, UINT brBackground) { WNDCLASS wc; wc.style=0; wc.cbClsExtra=wc.cbWndExtra=0; wc.lpfnWndProc=Proc; wc.hInstance=hInstance; wc.hIcon=LoadIcon(NULL, IDI_APPLICATION; wc.hCursor=LoadCursor(NULL, IDC_ARROW); wc.hbrBachground=(HBRUSH) (brBackground+1); wc.lpszMenuName=(LPCTSTR) NULL; wc.lpszClassName=szName; return (RegisterClass(& wc)! =0); } 2. Тут використовується файл заголовків Functions.h: #include < windows.h> extern HINSTANCE hInstance; //Оголошення функцій BOOL RegClass(WNDPROC LPCTSTR, UINT); 3. В файлі Extmpl11.cpp описані головні змінні і функції: #include “Functions.h” //оголошення функцій LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); //опис глобальних змінних HINSTANCE hInstance; Char szClassName[]=”WindowAppClass”; //опис головної функції INT WINAPI WinMain (HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow) { MSG msg; HWND hwnd; hInstance=hInst; if (! RegClass(WndProc, szClassName, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow(szClassName, “Приклад”, WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while (GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg); return (int) msg.wParam; } //опис функції вікон LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) {case WM_DESTROY: {PostQuitMessage(0); return 0; }} return DefWindowProc(hwnd, msg, wParam, lParam); } Відмінність від звичних програм міститься в заголовку головної функції, в специфічній функції вікна і в способі її виклику. Розглянемо алгоритм роботи цього додатку: 1. класи вікон реєструють на початку роботи додатку; 2. вікно додатку створюють до передачі управління циклу обробки повідомлень; 3. відсутні виклики функцій ShowWindow s UpdateWindow. Це обумволено тим, що вікно створене зі стилем WS_VISIBLE. В такому випадку функція CreateWindow надсилає всі повідомлення, які необхідні для відображення створеного вікна і перемалювання його робочої області; 4. управління передають циклу обробки повідомлень. В тілі цього циклу обираються і розподіляються повдомлення; 5. функція вікна обробляє повідомлення WM_DESTROY, а останні повідомлення повертає системі. Функція вікна додатку повинна обробляти це повідомлення; 6. додаток завершує роботу. Може здаватися, що відображення і видалення вікна – надто проста задача для такого “складного” тексту. Проаналізуємо, що ж насправді може зробити цей додаток. Стиль повністю визначає зовнішню поведінку вікна. Завдяки стилю WS_OVERLAPPEDWINDOW вікно містить подвійні рядки зміни розмірів і заголовок, в області заголовка розташовані системне меню і кнопки для згортання, відновлення розмірів і закриття вікна. За допомогою цих елементів можна переміщати вікно, змінювати його розміри, згортати вікно в піктограму, відновлювати і закривати вікно. Функційні можливості вікна могли б бути й ширше. Це вікно приймає всі повідомлення від користувача, системи та інших вікон. Тобто воно готове співпрацювати з користувачем і відкрити доступ до ресурсів системи. Але опис функції вікна містить обробку лише одного повідомлення. Останні повідомлення вона не обробляє і передає системі. По суті, вони видаляються з черги повідомлень.
|