Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.29;
Скачать: CL | DM;

Вниз

Надо добавить кнопку в заголовок окна.   Найти похожие ветки 

 
Dorex   (2002-05-20 09:57) [0]

Кто-нибудь может подсказать возможно ли добавить к кнопкам заголовка окна свою, чтобы стиль у нее был, как и у стандартных ("Минимизировать", "Закрыть" и.т.д)? Стиль необходимо считывать и задавать "на лету", чтобы работа не зависела от системы и установленной темы.


 
valery_f   (2002-05-20 15:41) [1]

Нечто подобное, кажись, делает компонента oxForm (www.opaquesoftware.com). Насколько я помню (давно это было) - "в лоб" там не получается. Только вот поддержку XP-тем не обещаю...


 
artgamer ©   (2002-05-20 23:01) [2]

В библиотеке R&A Lib есть компонент tRACaptionButton

Вся основная работа по рисованию кнопки в заголовке окна происходит в процедуре 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. Он понадобится для рисования окна. С помощью нескольких вызовов функции GetSystemMetrics узнаем размер стандартной кнопки заголовка окна. Затем вычисляем положение и размер прямоугольника, в котором будет рисоваться кнопка. И самое основное вызываем функцию 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 используется, если пользователь передумал и убрал курсор с кнопки при нажатой кнопке мыши.



 
Dorex   (2002-05-21 14:01) [3]

2 (valery_f ) Спасибо, но мне не удалось найти версию, в которой можно было бы поковыряться.
2 (artgamer ©) Сами кнопки рисуются запросто. Это много где описано и мною уже изучено :)
Интересует именно момент отлова темы окна. Коряво получается, когда "Мин.","Макс." и "Закрыть" раскрашены, а моя кнопочка - простой серый квадрат.



Страницы: 1 вся ветка

Текущий архив: 2002.07.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
6-95481
DikobraZ
2002-05-11 18:18
2002.07.29
Socket erro 10057


6-95466
TEXHAPb
2002-05-13 18:41
2002.07.29
Indy vs Fastnet


14-95536
MaximatorVeter
2002-07-02 19:15
2002.07.29
Неужели нельзя описать destructor класса с параметрами?


3-95222
Tutov Roman
2002-07-08 11:25
2002.07.29
Помогите составить запрос ...


14-95495
Arkady
2002-06-29 18:58
2002.07.29
QuickReport и Word