Форум: "WinAPI";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
ВнизНадо добавить кнопку в заголовок окна. Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c