Операційна система Microsoft Windows 3.1 для програміста
3.2. Стиль вікна
Визначений у класі вікна стиль класу вікна використовується під час створення з урахуванням цього класу всіх вікон. Для подальшого уточнення зовнішнього вигляду та поведінки вікна використовується інша характеристика – стиль вікна. Стиль вікна вказується під час створення вікна функцією CreateWindow. У наших прикладах основне вікно програми не мало стилю класу вікна, але для нього було визначено стиль вікна WS_OVERLAPPEDWINDOW:
Для визначення стилю вікна використовують символічні константи з префіксом WS_, визначені у файлі windows.h. За допомогою цих констант можна визначити приблизно два десятки стилів вікна, проте найчастіше використовуються кілька основних стилів.
Ми розглянемо три основні стилі вікон - вікна, що перекриваються (overlapped window), тимчасові вікна (pop-up window) і дочірні вікна (child window).
вікна, що перекриваються (overlapped)
У перших версіях операційної системи Windows (версії 1.х) вікна розташовувалися поруч і називалися tiled window (tile – черепиця). Зараз такі вікна не використовуються, замість них з'явилися вікна, що перекриваються, здатні перекривати вікна інших додатків. Вікна, що перекриваються, називаються також вікнами верхнього рівня (top-level window).
Файл windows.h містить наступне визначення стилю вікна, що перекривається:
У нашому додатку для визначення стилю вікна, що перекривається, ми використовували символічну константу WS_OVERLAPPEDWINDOW, визначену як логічне АБО декількох констант:
Константа WS_OVERLAPPED визначає базовий стиль вікна - вікно, що перекривається. Стиль WS_OVERLAPPEDWINDOW на додаток до базового вказує, що вікно повинне мати заголовок (константа WS_CAPTION), системне меню (WS_SYSMENU), товсту рамку для зміни розміру вікна (WS_THICKFRAME), кнопку мінімізаціїрозміру вікна (WS_MINIMIZEBOX) та кнопку для максимального збільшення розміру вікна (WS_MAXIMIZEBOX). Якщо вікно має заголовок, його можна переміщати по екрану.
Ви можете спробувати в попередньому прикладі змінити стиль вікна, створивши свій власний за допомогою наведених вище констант.
Програма Windows може створювати кілька вікон, пов'язаних між собою "узами спорідненості" та "відносинами власності". Зокрема, при створенні вікна, що перекривається, за допомогою функції CreateWindow як восьмий параметр функції ви можете вказати так званий ідентифікатор вікна-власника. Вікно-власник вже має існувати на момент створення другого вікна, яке має власника.
Таким чином, якщо ви створюєте кілька вікон, що перекриваються, одні вікна можуть належати іншим.
Якщо вікно-господар згортається в піктограму, то всі вікна, якими воно володіє, стають невидимими. Якщо ви спочатку згорнули у піктограму вікно, яким володіє інше вікно, а потім вікно-господар, піктограма першого (підлеглого) вікна зникає.
Якщо ви знищили вікно, автоматично знищуються і всі вікна, що належать йому.
Звичайне вікно, що перекривається, не має вікна-власника, може розташовуватися в будь-якому місці екрана і приймати будь-які розміри. Підлеглі вікна завжди розташовуються над поверхнею вікна-власника, загороджуючи його.
Координати створюваних функцією CreateWindow вікон, що перекриваються, вказуються по відношенню до всього екрану. Таким чином, якщо ви створюєте вікно, що перекривається, з координатами (0, 0), воно буде розташоване у верхньому лівому кутку екрана.
Тимчасові (pop-up) вікна
Іншим базовим стилем є стиль часових вікон, які зазвичай використовуються для виведення інформаційних повідомлень та залишаються на екранінетривалий час.
Тимчасові вікна мають стиль WS_POPUP, визначений у файлі windows.h так:
Тимчасові вікна, на відміну перекриваються, можуть мати заголовок (title bar). Якщо для тимчасового вікна визначено заголовок, воно може мати системне меню. Часто для створення тимчасових вікон, що мають рамку, використовується стиль WS_POPUPWINDOW, визначений у файлі windows.h так:
Якщо потрібно додати до тимчасового вікна системне меню та заголовок, стиль WS_POPUPWINDOW слід використовувати у комбінації зі стилем WS_CAPTION, що додає заголовок.
Тимчасові вікна можуть мати вікно власника та можуть самі володіти іншими вікнами. Всі зауваження, зроблені нами щодо володіння вікнами, що перекриваються, справедливі і для тимчасових вікон.
Початок системи координат, що використовується при створенні тимчасових вікон, знаходиться у верхньому лівому куті екрана. Тому при створенні тимчасових вікон використовуються екранні координати (так само, як і при створенні вікон, що перекриваються).
При зміні розмірів часового вікна (як і дочірнього) функція вікна отримує повідомлення WM_PAINT, у параметрах якого вказані нові розміри вікна.
У загальному випадку ви можете розглядати тимчасові вікна як спеціальний вид вікон, що перекриваються.
Дочірні вікна
Базовий стиль дочірніх вікон визначається за допомогою константи WS_CHILD:
За аналогією з іншими базовими стилями у файлі windows.h визначено константу WS_CHILDWINDOW, яка повністю еквівалентна константі WS_CHLD:
Перелічимо особливості дочірніх вікон.
Зрозуміло, що дочірні вікна повинні мати вікно-батька (вікон-сиріт не буває!). Тільки дочірні вікна можуть мати батьків, що перекривають і тимчасові вікна можуть мати вікно.господаря, але з батька. У дочірніх вікон можуть бути "брати" (або "сестри", кому більше подобається).
Дочірні вікна завжди розташовуються на поверхні вікна-батька. При створенні дочірнього вікна початок системи координат розташовано в лівому верхньому куті внутрішньої поверхні вікна-батька (але не у верхньому куті екрану, як це було для вікон, що перекриваються і тимчасових).
Так як дочірні вікна перекривають вікно-батька, якщо ви зробите клацання мишею над поверхнею дочірнього вікна, повідомлення від миші потрапить у функцію дочірнього, але не батьківського вікна.
При створенні дочірнього вікна як дев'ятий параметр (замість ідентифікатора меню, якого не може бути у дочірнього вікна) функції CreateWindow необхідно вказати створений вами ідентифікатор дочірнього вікна. Таким чином, якщо для вікна програми ви створюєте кілька дочірніх вікон, необхідно для кожного вікна вказати свій ідентифікатор (типу int). Цей ідентифікатор буде використаний дочірнім вікном при надсиланні повідомлень батьківському вікну, тому ви повинні використовувати різні ідентифікатори при створенні різних дочірніх вікон, хоча це і не обов'язково.
Дочірнє вікно хіба що " прилипає " до поверхні батьківського вікна і переміщається разом із. Воно ніколи не може вийти за межі батьківського вікна. Всі дочірні вікна приховуються при згортанні вікна-батька в піктограму і з'являються знову при відновленні батьківського вікна.
При зміні розмірів батьківського вікна дочірні вікна, на яких відобразилася така зміна (які вийшли за межі вікна та з'явилися знову), отримують повідомлення WM_PAINT. При зміні розмірів батьківського вікна, дочірні вікна не отримують повідомлення WM_SIZE. Це повідомлення потрапляє лише у батьківське вікно.
Список стиліввікна
Наведемо повний перелік можливих стилів вікна, визначених як символічних констант у файлі windows.h. Деякі з наведених тут стилів будуть детально розглянуті у відповідних розділах цього тома або у наступних томах "Бібліотеки системного програміста".
Наведені вище стилі не завжди сумісні один з одним. Наприклад, вікно, що перекривається, не може бути одночасно ще й тимчасовим. Користуючись таблицею, ви зможете визначити сумісність стилів. У цій таблиці символом "+" позначені стилі, які можна використовувати для створення перекриваються, тимчасових та дочірніх вікон.