Вся основная работа по рисованию кнопки в заголовке окна происходит в процедуре DrawBtn. Рассмотрим код подробней.
procedure TForm1.DrawBtn; var WDc: HDc; Cx,Cy: Integer; XFrame, Yframe: Integer; begin WDc := GetWindowDc(Handle); Cx := GetSystemMetrics(SM_CXSize); Cy := GetSystemMetrics(SM_CYSize); xFrame := GetSystemMetrics(SM_CXFrame); yFrame := GetSystemMetrics(SM_CYFrame); R := Bounds(Width - xFrame - 4*Cx + 2, yFrame + 2, Cx - 2, Cy - 4); if Press then DrawFrameControl(WDc,R,DFC_BUTTON,DFCS_ButtonPUSH or DFCS_PUSHED) else DrawFrameControl(WDc,R,DFC_BUTTON,DFCS_ButtonPUSH); ReleaseDc(Handle,WDC); end;
Переменная WDc содержит контекст устройства окна, полученной функцией GetWindowsDc.
Он понадобится для рисования окна. С помощью нескольких вызовов функции GetSystemMet
rics узнаем размер стандартной кнопки заголовка окна. Затем вычисляем положение и размер прямоугольника, в котором будет рисоваться кнопка. И самое основное вызываем функцию DrawFrameControl. Эта функция рисует стандартный Control заданного типа и стиля. Используя тип DFC_BUTTON рисуем кнопку. Задавая стиль DFCS_BUTTONPUSH рисуется кнопка в нормальном состоянии, если задать стиль DFCS_BUTTONPUSH or DFCS_PUSHED рисуется кнопка в нажатом состоянии. Переменная Press содержит состояние в котором следует рисовать кнопку. В конце работы освобождаем контекст.
Теперь о самом неприятном. Чтобы все это заработало так как надо необходимо обработать кучу сообщений которое windows посылает приложению.Куча это, конечно, громко сказано, но у меня получилось 7, плюс 1 определенное мной для отслеживания Click. Вот эти сообщения:
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: Можно обьединить кнопку в заголовке окна и пункт системного меню, описаный на страничке манипуляции с системным меню Пример программы, как это сделать самому. И пример компоненты, как это сделать не мучаясь :)
Delphi. Программирование на языке высокого уровня: Учебник для вузов
Книга посвящена новейшей версии Delphi 7 Studio. Здесь изложены как приемы программирования в среде Delphi, ее главные составные части — галереи компонентов, хранилища объектов, вспомогательный инструментарий, так и сам язык программирования Delphi. Подробно рассматриваются компоненты программ, некоторые дополнительные возможности — динамически подключаемые библиотеки, интерфейсы, технология СОМ и система ModelMaker. Книга может быть полезна как начинающим — в качестве пособия для первоначального изучения среды и языка Delphi, так и опытным программистам, желающим пополнить свои знания в области применения языка Delphi. Допущено Министерством образования Российской Федерации в качестве учебника для студентов высших учебных заведений, обучающихся по направлению подготовки дипломированных специалистов «Информатика и вычислительная техника».
Автор: Фаронов В. В.
Курс обучения Turbo Pascal. На страницах проекта изложен полный обучающий курс языка Turbo Pascal. Каждый раздел сайта посвящен определенной теме. К каждой теме приведена исчерпывающая информация. Каждая тема состоит из занятий ...
» Оценка сайта: 2
Хокку дня
Меньше и меньше кругом самураев Вот и соседи недавно Тоже свалили в Израиль...
Афоризмы
Очень часто нам не нужно, чтобы ЭТО было хорошо. Нам нужно, чтобы ЭТО было ЗАВТРА....
Фраза дня
Кто с чем к нам зачем, тот от того и - того! (А. Невский)
Дурацкие законы (информация предоставлена сайтом kurilka.com)
Если вы в Техасе(США) , даже не думайте стрелять по бизонам со второго этажа отеля.
В Канзасе (США) все пешеходы, пересекающие дорогу ночью, должны носить световые отражатели.
И на закуску коротенький анекдот
Иван Грозный был против абортов! Он детей взрослыми убивал...