Завданняодноразового інтервалу часу
При необхідності відпрацювання одноразового інтервалу часу необхідно виконати всі описані вище дії, тільки як режим встановлення часової події вказується константаTIME_ONESHOT:
timeBeginPeriod(1);//Встановимо максимальну роздільну здатність
void CALLBACK TimeProc(UINT,UINT,DWORD,DWORD,DWORD)
timeEndPeriod(1);//Скасування встановленого раніше дозволу
..timeKillEvent(mmr);//У припущенні, щоmmr– глобальна
У даному варіанті повідомленняWM_USERнадсилається лише один раз після закінчення точно 1с (з похибкою в 1 мс). У прикладній функціїTimeProcобробки цього повідомлення, крім активізації змістовних дій (за допомогою посилки повідомленняWM_USER), необхідно скасувати встановлений раніше тимчасовий дозвіл, як це і показано в наведених вище рядках.
4. Дочірні вікна Створення та використання дочірніх вікон
Будь-яка реальна програма Windows містить велику кількість вікон. Хоча всі графічні елементи, що становлять екранний кадр програми (текстові рядки, геометричні фігури, растрові зображення) можна вивести безпосередньо в головне вікно, такий спосіб формування екранного кадру зазвичай виявляється незручним, головним чином через неможливість роздільної взаємодії (за допомогою миші або клавіатури) із цими елементами. Організація системи вкладених, або породжених, вікон дозволяє для кожного такого вікна або групи вікон мати, наприклад, свою форму курсора або свій колір фону; головна ж перевага породжених вікон полягає у можливості надання кожному вікну індивідуальної віконної функції. Це дозволяє окремо і по-різному обробляти для кожного вікна повідомлення, що надходять до нього Windows (або,навпаки, надсилати у вікна програмно сформовані повідомлення).
Так, на рис. 4.1 наведено для прикладу можливий вид головного вікна програми, яка управляє деякою вимірювальною установкою. У вікні є поле для введення експозиції, що пояснює напис “Введіть Експозицію:”, кнопка пуску, а також велике дочірнє вікно для динамічного виведення часу, що залишився до кінця сеансу вимірювання.

Мал. 4.1. Дочірнє вікно у головному вікні програми
Реально майже всі зображення, які ми бачимо на екрані, – різноманітні кнопки, смуги прокручування, повзунки, поля для введення тексту, зображення різних приладів та індикаторів – є вікнами з тими чи іншими характеристиками. Зазвичай ці вікна утворюють ієрархічну систему. Наприклад, будь-який діалог насамперед є вікно; проте в ньому зазвичай є ще й внутрішні вікна - кнопки, списки, смуги прокручування і т.д.
Модальні діалоги, що широко використовуються в додатках Windows як засіб управління роботою програми, належать до спливаючих вікон, що визначається вказівкою при описі їх стилю константиWS_POPUP. Модальні діалогові вікна можуть бути лише спливаючими. Загалом вкладені вікна, зокрема немодальні діалоги, можуть бути як спливаючими, так і дочірніми; в останньому випадку в описі їх стилю є константаWS_CHILD. Спливаючі та дочірні вікна характеризуються такими відмінностями:
якщо в головному вікні програми одночасно утворені і спливаючі, і дочірні вікна, то вікна, що спливають, будуть зображуватися поверх дочірніх, "спливати" над ними, що і визначило їх назву;
дочірні вікна можуть переміщатися тільки в межах батьківського вікна, тоді як положення вікон, що спливають.не обмежено будь-якими межами; спливаюче вікно можна витягнути за межі головного вікна програми і помістити в будь-якому місці екрана (для чого необхідно, щоб спливаюче вікно, крім рамки, мала ще й смугу заголовка);
координати дочірніх вікон задаються щодо меж робочої області батьківського вікна; координати спливаючих вікон задаються щодо меж екрана;
спливаюче вікно може містити власне меню; у дочірніх вікнах меню немає.
Зазначені відмінності роблятьвипливаючівікна зручнішими для організації активного діалогу з користувачем, в процесі якого він працює з органами управління вікном, вводить вхідні дані у відповідні поля, вибирає необхідні режими і т. д.Дочірнівікна часто використовуються як інформаційні, а також для надання окремим областям головного вікна специфічних властивостей. Виділивши, наприклад, у тексті довідки деякі ключові слова в окремі вікна, можна з класом цих вікон зв'язати курсор характерної форми (звичайну стрілку замінити на зображення долоні), задати в контексті пристрою інший колір символів та також визначити функцію обробки повідомленьWM_LBUTTONDOWN, щоб при клацанні мишею по виділеному слову викликався текст, що пояснює це слово.
Діалогові вікна відносяться до вікон певних класів, описаних у Windows. Це обмежує їх можливості, але спрощує взаємодію Космосу з елементами управління, що входять до складу діалогових вікон, оскільки в Windows для цього передбачені стандартні засоби.
У тих випадках, коли вкладене вікно має забезпечувати ширші можливості, доцільно створити в програмі діалогове, а звичайне породжене вікно і наділити його необхідними характеристиками. При цьому, якщо форма діалогових віконописується у файлі ресурсів, а створення здійснюється функціямиDialogBox()абоCreateDialog(), то породжені (як дочірні, так і випливають) вікна описуються безпосередньо в програмі, а створюються універсальними функціямиCreateWindow()абоCreateWindowEx(). Для певності ми далі говоритимемо про дочірні вікна, хоча практично весь цей матеріал однаково відноситься і до спливаючих вікон.
Процедура створення та обслуговування дочірнього вікна, як і будь-якого іншого, складається з трьох етапів:
реєстрації класу дочірнього вікна, у процесі якої за вікном закріплюється віконна функція;
створення вікна функцією WindowsCreateWindow()із зазначенням стилю вікна та його розташування;
обробки повідомлень, що надходять у дочірнє вікно.
Класи всіх дочірніх вікон зручно реєструвати у функціїWinMain()слід за реєстрацією класу головного вікна; створюються ж дочірні вікна зазвичай функціїOnCreate(), викликаної Windows у процесі створення головного вікна.
Повідомлення, що надходять до головного вікна, обробляються, як відомо, віконною функцією головного вікна; Для обробки повідомлень, що надходять у дочірні вікна, має бути передбачена окрема віконна функція. Якщо при цьому дочірніх вікон кілька, і всі вони мають суттєво різні характеристики, для них передбачають окремі класи і, відповідно, окремі віконні функції. Якщо ж дочірні вікна більш однорідні, всі вони можуть належати одному класу, і тоді віконна функція для всіх дочірніх вікон буде одна, а окремі вікна доведеться розрізняти за їхніми дескрипторами.
На рис. 4.2 наведено вигляд головного вікна програми, призначення якого – виведення на екран інформації з бази даних пацієнта.

Мал.4.2. Головне вікно програми з кількома дочірніми вікнами
У головному вікні утворено одне велике дочірнє вікно (з рамкою та смугою заголовка) для виведення даних у графічній формі та п'ять “керуючих” вікон меншого розміру з назвами даних, що відображаються. Керуючі вікна не мають ні заголовка, ні рамки, і тому не виділяються на загальному тлі головного вікна. Їх розміри відповідають розмірам рядків тексту, що виводяться в них. Всі вони належать до одного класу, для якого задана специфічна форма курсору – зображення кисті руки. У єдину віконну функцію цих вікон включена обробка повідомленняWM_LBUTTONDOWN.При натисканні мишею по тому чи іншому рядку з назвою даного у велике дочірнє вікно виводиться відповідна інформація у вигляді графіка.
Таким чином, у цьому додатку зареєстровані класи трьох вікон – головного вікна, великого вікна для виведення графіка та п'яти вікон, що управляють, з назвами даних. Відповідно, у додатку є і три віконні функції. Легко зрозуміти, що віконна функція головного вікна майже порожня – в ній може оброблятися одне єдине повідомленняWM_DESTROYпро завершення програми. Віконна функція вікна графіка містить обробку повідомленьWM_PAINT, а вікна з назвами даних, як зазначалося, повинні обробляти повідомленняWM_LBUTTONDOWN.
Наведемо тепер як зразок трохи скорочений текст простої програми, в якій, крім головного вікна, передбачено ще одне дочірнє вікно для виведення графіка (рис. 4.3).

Мал. 4.3. Головне вікно програми з одним дочірнім вікном
char szTitle[]="Дочірнє вікно в головному";
/*Головна функція програми*/
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)