Диалогови прозорци С IT тамбура
Потребителски инструменти
Инструменти за сайта
Съдържание
C++ диалогови прозорци
Диалоговите прозорци съществуват модални (модалните диалогови прозорци се създават от функцията DialogBox) и немодални (безмоделните диалогови прозорци се създават от функцията CreateDialog). Тези две функции зареждат шаблон на диалогов прозорец от изпълнимия файл на приложението и създават изскачащ прозорец, който съответства на спецификацията на шаблона. Има и други функции, които създават диалогов прозорец, използвайки шаблони в паметта; те предават допълнителна информация на процедурата на диалоговия прозорец как се създава диалоговият прозорец.
Контроли на диалогов прозорец
Шаблонът задава позицията, ширината, височината, стила, идентификаторите и класа на прозореца за всяка контрола в диалоговия прозорец. Системата създава всяка контрола, като предава данните им на функцията CreateWindowEx. Контролите се създават в реда, в който са дефинирани в шаблона. Шаблонът трябва да дефинира подходящия брой, тип и ред на контролите, за да гарантира, че потребителят може да направи необходимия вход, за да изпълни задачата, свързана с диалоговия прозорец.
За всяка контрола шаблонът задава стилови стойности, които определят външния вид и работата на контролата. Всяка контрола е дъщерен прозорец и следователно трябва да има стил WS_CHILD. За да се гарантира, че контролата е видима, когато се покаже диалоговият прозорец, всяка контрола трябва също да има стил WS_VISIBLE. Други често използвани стилове на прозорци са WS_BORDER за контроли, които не е задължително да имат граници, WS_DISABLED за контроли, които трябва да бъдат деактивирани, когато се създава първоначалният прозорец.диалогов прозорец и WS_TABSTOP и WS_GROUP за контроли, които могат да бъдат достъпни с помощта на клавиатурата. Стиловете WS_TABSTOP и WS_GROUP се използват във връзка с диалоговия интерфейс на клавиатурата, обсъден по-късно в тази глава.
Шаблонът може също да задава стилове, специфични за класа на прозореца на контролата. Например, шаблон, който дефинира контролен бутон, трябва да му даде стил като BS_PUSHBUTTON или BS_CHECKBOX. Системата предава стиловете на контролата към процедурата на прозореца на този елемент чрез съобщението WM_CREATE, което позволява на процедурата да персонализира външния вид и усещането на контролата.
Системата преобразува стойностите на координатите на позицията, ширината и височината от базовите единици на диалоговия прозорец в пиксели, преди да ги предаде на функцията CreateWindowEx. Когато системата създаде контрола, тя дефинира диалоговия прозорец като родителски прозорец. Това означава, че системата винаги третира координатите на позицията на контролата като работни координати, спрямо горния ляв ъгъл на клиентската област на диалоговия прозорец.
Шаблонът дефинира клас прозорец за всяка контрола. Обикновено диалоговият прозорец съдържа контроли, които принадлежат към предварително дефинирани класове на контролни прозорци, като например клас на прозорец с бутони и полета за редактиране. В този случай шаблонът дефинира класа на прозореца чрез присвояване на подходящата предварително дефинирана стойност на атома на класа. Когато диалогов прозорец съдържа контрола, която принадлежи към клас прозорец на потребителска контрола, шаблонът дава името на този регистриран клас прозорец или стойността на атома, свързан в момента с това име.
За да позволи на потребителя да затвори диалоговия прозорец, шаблонът трябва да зададе поне един команден бутони му дайте контролния ID IDCANCEL. За да позволи на потребителя да избира между прекратяване или отмяна на задачата, свързана с диалоговия прозорец, шаблонът трябва да настрои два командни бутона. с надписи OK и Cancel (Отказ), съответно с контролни идентификатори IDOK и IDCANCEL.
Шаблонът също задава незадължителния текст и данни за създаване на контролата. Текстът обикновено е предназначен да указва контролни бутони или да задава първоначалното текстово съдържание на статична контрола. Данните за създаване са един или повече байта данни, които системата предава на процедурата на прозореца на контролата, когато контролата е създадена. Данните за създаване са полезни за контроли, които изискват повече информация за тяхното първоначално съдържание или стил, отколкото се предоставя от други данни. Например, едно приложение може да използва данните за създаване, за да зададе първоначалните параметри и контролния обхват на лентата за превъртане.
Процедури на диалогов прозорец
Процедурата на диалоговия прозорец е подобна на прозоречната процедура, тъй като системата изпраща съобщения до процедурата, когато разполага с информацията за задаване или изпълнение на задачи. За разлика от прозоречната процедура, диалоговата процедура никога не извиква функцията DefWindowProc. Вместо това връща TRUE, ако обработва съобщението, или FALSE, ако не е.
Всяка процедура на диалогов прозорец има следната форма:
Параметрите на процедурата служат за същата цел като в прозоречна процедура, параметърът hwndDlg получава манипулатора на прозореца на диалоговия прозорец.
Повечето процедури на диалогов прозорец обработват съобщението WM_INITDIALOG и съобщенията WM_COMMAND, изпратени от органитеконтрол, но не обработва всичко, ако има други съобщения. Ако процедурата на диалоговия прозорец не обработи съобщението, тя трябва да върне FALSE, за да инструктира системата да обработи съобщенията вътрешно. Единственото изключение от това правило е съобщението WM_INITDIALOG. Процедурата на диалоговия прозорец трябва да върне TRUE, за да инструктира системата да обработи допълнително съобщението WM_INITDIALOG. И в двата случая процедурата не трябва да извиква DefWindowProc.
Диалогово поле -модално
Модалните диалогови прозорци блокират всички други прозорци, докато не бъдат затворени. Когато създавате модален диалогов прозорец, системата го прави активен прозорец. Диалоговият прозорец остава активен, докато процедурата на диалоговия прозорец извика функцията EndDialog или системата активира прозореца в друго приложение. Нито потребителят, нито приложението могат да направят прозореца на собственика активен, докато модалният диалогов прозорец не бъде унищожен.
Примерно WinAPI приложение. Няма основен прозорец. Цялото приложение е изградено върху диалогови прозорци.