Как поместить кнопку в заголовок формы |
![]() |
![]() |
Статьи | ||||
Что нужно сделать, чтобы добавить кнопку в заголовок формы?
Рисуем TRect как кнопкуВы не можете помещать объекты VCL в неклиентскую область окна, но можно нарисовать его и моделировать вид кнопки. Чтобы выполнить рисование в области заголовка окна, нужно сделать три важных вещи:
Все это выполняется в одном вызове процедуры DrawTitleButton, который приведен ниже:
Шаг первый выполняется, делая четыре вызова функций WinAPI GetSystemMetrics, запрашивая систему о ширине и высоте окна (SM_CXRFAME и SM_CYFRAME) и размер точечных рисунков, содержащихся в области заголовка (SM_CXSIZE и SM_CYSIZE). В шаге 2 выполняется функция Bounds, которая возвращает TRect с размерами и параметрами позиции. Заметьте, что здесь используются некоторые условные директивы компилятора. Это потому, что размер кнопок в заголовках Windows 95 и Windows 3.1 отличаются, так что и размер должен устанавливаться по-другому. Теперь это можно использовать в любой версии Windows. Однако, так как Windows NT UI то же самое, что и Windows 3.1, нужно определить, является ли это Windows NT и если так, нужно определить TRect точно так же, как и для Windows 3.1. Чтобы выполнить шаг 3, делаем вызов DrawButtonFace модуля Buttons, чтобы нарисовать кнопки в пределах TRect, который мы уже определили. Как только добавим, нужно включить код для рисования точечного рисунка на кнопке. Здесь тоже применяется условная директива компилятора для различных версий Windows. Потому что точечный рисунок 16 Х 16 пикселей может быть слишком большим для Windows 95. Так что здесь используется StretchDraw, чтобы растянуть рисунок по размеру кнопки. Ловушки событий Drawing и PaintingВы должны удостовериться, что кнопка будет видима каждый раз после перерисовки формы. Перерисовка происходит в ответ на активацию и изменение размеров. Если не будет обновления кнопки, она будет теряться, когда происходить перерисовка формы. Нужно написать обработчик события, которые выполнят эти действия и будут обновлять кнопку. Следующие четыре процедуры обрабатывают события нажатия кнопки и обновления:
Каждый раз, когда происходит одно из этих событий, оно в свою очередь вызывает процедуру DrawTitleButton. Это будет гарантировать, что кнопка будет всегда видима в области заголовка. Здесь используется обработчик события формы OnResize, чтобы вынудить выполняться WM_NCACTIVATE. Обработка щелчков мышиТеперь, когда получен код, который рисует кнопку, нужно обработать щелчки мыши на кнопке. Это делается двумя процедурами. Первая процедура проверяет, был ли щелчок мыши в области кнопки, а вторая фактически исполняет выполнение кода, связанное с нажатием кнопки:
Первая процедура WMNCHitTest сообщение нажатия, чтобы определить, где была нажата мышь в неклиентской области. В этой процедуре проверяется, что точка нажатия была в пределах нашего TRect, используя функцию PtInRect. Если щелчок мыши был выполнен в пределах TRect, то результат сообщения устанавливается в htTitleBtn, которая является константой и объявлена как htTitleBtn + 1. htSizeLast - константа проверки нажатия, чтобы проверить где было последнее нажатие. А теперь объединим все вместеТеперь давайте посмотрим на полный код в форме: |