Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-95534
Fredericco
2002-07-02 11:21
2002.07.29
У меня созрел вопрос про Сокеты.


7-95579
Сергей Ф
2002-04-27 20:58
2002.07.29
Как определить 95,98,NT,ME,2000 или Win XP стоит на компьютере?


1-95351
ilg
2002-07-18 13:07
2002.07.29
AnsiLowerCase для Char


1-95403
Smok_er
2002-07-10 17:49
2002.07.29
Изменение цвета/стиля надписи на TTabSheet


3-95258
Ильдар
2002-07-09 12:44
2002.07.29
Запросы, DBGridы...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский