Как да поставите бутон в заглавката на формуляр

Всичко за програмирането.

Главно меню

Как да поставите бутон в заглавката на формуляр

Какво трябва да се направи, за да се добави бутон към заглавката на формуляра?

  • Имаме нужда от функция, за да начертаем бутон
  • Необходимо е да преначертаете бутона, когато бутонът е видим/невидим, когато формулярът е активиран, преоразмерен или преместен
  • Трябва да има събитие с щракване на мишката върху бутон

Начертайте TRect като бутон

Не можете да поставитеVCL обекти в неклиентската област на прозорец, но можете да го нарисувате и да симулирате външния вид на бутон. Има три важни неща, които трябва да направите, за да рисувате в заглавната лента на прозорец:

  1. Трябва да получим текущите координати на прозореца и размера на изображението, за да знаем в коя област да рисуваме и какъв размер ще бъде правоъгълникът
  2. След това трябва да дефинирате структураTRect със специфичен размер и позиция в областта на заглавката
  3. Накрая начертайтеTRect като бутон, след което добавете всяко изображение или текст, които трябва да бъдат върху повърхността на бутона

Всичко това се прави с едно извикване на процедуратаDrawTitleButton, която е показана по-долу:

Първата стъпка се извършва чрез извършване на четири извиквания към функциите WinAPIGetSystemMetrics, запитване до системата за ширината и височината на прозореца (SM_CXRFAME иSM_CYFRAME ) и размера на растерните изображения, съдържащи се в областта на заглавката (SM_CXSIZE иSM_CYSIZE ).

В стъпка 2 се изпълнява функциятаBounds, която връщаTRect с размери и параметри на позицията. Обърнете внимание, че тук се използват някои директиви на условен компилатор. Това е така, защото размерите на бутоните в заглавките на Windows 95 и Windows 3.1 са различни, така че размерът трябвазададени по различен начин. Това вече може да се използва във всяка версия на Windows. Въпреки това, тъй като потребителският интерфейс на Windows NT е същият като Windows 3.1, трябва да определите дали е Windows NT и ако е така, трябва да дефиниратеTRect по същия начин, както за Windows 3.1.

За да завършим стъпка 3, извиквамеDrawButtonFace на модула Buttons, за да изчертаем бутоните в рамките наTRect, който вече сме дефинирали. След като го добавим, трябва да включим кода, за да начертаем растерното изображение върху бутона. Тук също се използва директива за условен компилатор за различни версии на Windows. Тъй като растерно изображение от 16 x 16 пиксела може да е твърде голямо за Windows 95. Така че тукStretchDraw се използва за разтягане на растерното изображение, за да пасне на бутона.

Рисувайте и рисувайте капани за събития

Трябва да се уверите, че бутонът се вижда всеки път, когато формулярът се преначертава. Преначертаването става в отговор на активиране и преоразмеряване. Ако бутонът не се актуализира, той ще бъде загубен, когато формулярът бъде преначертан. Трябва да напишете манипулатор на събития, който ще извърши тези действия и ще актуализира бутона. Следните четири процедури обработват събития с щракване върху бутон и актуализиране:

Всеки път, когато възникне едно от тези събития, то на свой ред извиква процедуратаDrawTitleButton. Това ще гарантира, че бутонът винаги се вижда в областта на заглавието. Това използва манипулатор на събитие във форматаOnResize, за да принудиWM_NCACTIVATE да се изпълни.

Работа с щраквания на мишката

Сега, когато имаме кода, който рисува бутона, трябва да обработваме щракванията на мишката върху бутона. Това става на две процедури. Първата процедура проверява дали мишката е щракната в областта на бутоните, а втората действителноизпълнява изпълнение на код, свързано с щракване на бутон:

Първата процедураWMNCHitTest е съобщение за щракване, за да се определи къде е щракната мишката в неклиентската област. Тази рутина проверява дали точката на попадение е в рамките на нашияTRect с помощта на функциятаPtInRect. Ако щракването на мишката е било вTRect, тогава резултатът от съобщението е зададен на htTitleBtn, което е константа и се декларира като htTitleBtn + 1. htSizeLast е константа за тест за попадение, за да се провери къде е било последното попадение.

Сега нека съберем всичко заедно

Сега нека да разгледаме пълния код във формата: