Страницы

Поиск по вопросам

суббота, 6 июля 2019 г.

Как сделать дополнительные кнопки на окне?

Как сделать дополнительные кнопки на окне, помимо 3 основных (свернуть, развернуть, закрыть) на C#?


Ответ

Для начала, судя по всему, без использования Win32 не обойтись. (Или третьесторонней библиотеки, к-ая за вас использует Win32).
Вот здесь я нашел более менее ответ. Пример оттуда же. (попробовал, правда работает)
Далее перевожу вариант, совместимый с Аэро (как наиболее актуальный):
Это решение основано на Win32-примере по этой ссылке: http://msdn.microsoft.com/en-us/library/bb688195(VS.85).aspx
В принципе, нужно сделать следующее:
Расширить клиентскую область окна так, чтобы она покрывала весь Frame. Для этого нужно перехватить WM_NCCALCSIZE-сообщение и вернуть 0. Так не-клиентская область станет нулевого размера, что значит, что клиентская будет покрывать все окно. Расширить Frame до размеров клиентской области, используя DwmExtendFrameIntoClientArea. Это скажет ОС рисовать Frame над клиентской областью.
Вышеописанные шаги дают вам окна со стандартным стеклянным оформлением, исключая иконку окна и заголовок. Кнопки свернуть, развернуть и закрыть будут продолжать рисоваться и работать. Что не будет работать, так это перетаскивание и изменение размеров окна, потому что фрейма теперь нет, а клиентская область покрывает все окно.
Теперь можно рисовать на окне как обычно. Можно даже поместить контролы в заголовок.
Осталось только перехватывать WM_NCHITTEST-сообщения, брать из них информацию о положении курсора мыши и возвращать информацию о том, в какой части окна он находится. Например, если вернуть HT_CAPTION, то окно будет работать так, как будто курсор находится на заголовке, и будет позволять перетаскивать окно и т.д. С этой функцией получится сделать полнофункциональное окно с кастомным фреймом.

Комментариев нет:

Отправить комментарий