Упражнениеединичен интервал от време
Ако е необходимо да изработите единичен интервал от време, трябва да изпълните всички действия, описани по-горе, само константатаTIME_ONESHOTе посочена като режим за задаване на временно събитие:
timeBeginPeriod(1);//Задайте максимална разделителна способност
void CALLBACK TimeProc(UINT,UINT,DWORD,DWORD,DWORD)
timeEndPeriod(1);//Анулиране на предварително зададено разрешение
..timeKillEvent(mmr);//Приемайки, чеmmrе глобален
В този вариант съобщениетоWM_USERсе изпраща само веднъж след точно 1s (с грешка от 1ms). Във функцията на приложениетоTimeProcза обработка на това съобщение, в допълнение към активирането на значими действия (чрез изпращане на съобщениеWM_USER), е необходимо да се отмени предварително зададеното временно разрешение, както е показано в редовете по-горе.
4. Дъщерни прозорци Създаване и използване на дъщерни прозорци
Всяко реално Windows приложение съдържа голям брой прозорци. Въпреки че всички графични елементи, които съставляват рамката на екрана на приложението (текстови низове, геометрични фигури, растерни изображения), могат да се показват директно в главния прозорец, този метод за формиране на рамка на екрана обикновено е неудобен, главно поради невъзможността за отделно взаимодействие (с помощта на мишка или клавиатура) с тези елементи. Организацията на системата от вложени или генерирани прозорци позволява всеки такъв прозорец или група от прозорци да има например своя собствена форма на курсора или собствен цвят на фона; основното предимство на генерираните прозорци е възможността да се даде на всеки прозорец индивидуална прозоречна функция. Това позволява отделна и различна обработка за всеки прозорец на входящи съобщения на 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)