Главная страница
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.015 c
3-95229
Артём
2002-07-08 15:15
2002.07.29
Как прочитать данные из таблицы, возвращаемые хран.проц.


1-95355
EugeneP
2002-07-18 11:56
2002.07.29
Delphi 5 и Delphi 6. Компиляция DLL


6-95472
!Daemon
2002-05-20 11:57
2002.07.29
Как проконтролировать отсылку письма из почтового клиента


1-95297
Leny
2002-07-15 08:20
2002.07.29
Потоки


1-95309
AlexAlex
2002-07-16 18:00
2002.07.29
Программное управление положением подписей (Mark) в TChart