Бутон в заглавната лента

Обикновено прозорците на приложения имат 3 бутона в заглавната лента, минимизиране, максимизиране и затваряне. Тази страница ще ви каже как да добавите свой собствен бутон към заглавието на прозореца. Ако проявявате интерес, нека започваме.

След кратко капене в недрата на windows API, успяхме да постигнем желания резултат. Ето резултата: изходен код за основния модул.

Цялата основна работа по изчертаването на бутона в заглавната лента се извършва в процедуратаDrawBtn. Нека разгледаме кода по-подробно.

ПроменливатаWDcсъдържа контекста на устройството на прозореца, получен от функциятаGetWindowsDc. Ще е необходимо да нарисувате прозореца. С помощта на няколко извиквания на функциятаGetSystemMetricsоткриваме размера на стандартния бутон за заглавие на прозореца. След това изчисляваме позицията и размера на правоъгълника, в който ще бъде нарисуван бутонът. И най-важното, извикваме функциятаDrawFrameControl.Тази функция рисува стандартна контрола от посочения тип и стил. Използвайки типаDFC_BUTTON, рисуваме бутон. Задаването на стилаDFCS_BUTTONPUSHрисува бутона в нормално състояние, задаването на стилаDFCS_BUTTONPUSH или DFCS_PUSHEDрисува бутона в натиснато състояние. ПроменливатаPressсъдържа състоянието, в което трябва да бъде изчертан бутонът. В края на работата освобождаваме контекста.

Сега за най-неприятното. За да работи всичко това, е необходимо да се обработят куп съобщения, които Windows изпраща на приложението.Куп, разбира се, е силно казано, но получих 7, плюс 1, което дефинирах за проследяване на кликвания. Тези съобщения са:

  • WM_NCPAINT
  • WM_NCACTIVATE
  • WM_NCLBUTTONDOWN
  • WM_NCHITTEST
  • WM_SIZE
  • WM_NCLBUTTONUP
  • WM_LBUTTONUP
По принцип обработката на съобщения се свежда до извикване наDrawBtn. Обработва сеWM_NCLBUTTONDOWNопределя дали левият бутон на мишката е бил спуснат в зоната, заета от бутона.WM_NCHITTESTпредотвратява увеличаването на прозореца.WM_SIZEизобразява бутона правилно, когато прозорецът е преоразмерен.WM_NCLBUTTONUPОпределя дали мишката е щракната. И извиква манипулатора с помощта наPostMessage. ИзвикванетоPostMessageсе прави, така че прозорецът да има време да отговори на други съобщения.WM_LBUTTONUPсе използва, ако потребителят промени решението си и премахне курсора от бутона, докато бутонът на мишката е натиснат.

PS: Възможно е да комбинирате бутона в заглавието на прозореца и елемента от системното меню, описан в страницата за манипулиране на системното меню