Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« : 09-07-2009 14:13 » |
|
Вообще тема .NET-овская на C#, но больше посвящена тонкостям WinAPI, чем .NET, поэтому помещаю сюда.
Хочу сделать главное окно приложения полностью skin'изированным. Т.е. без стандартой рамки и заголовка. Однако нужно сделать штатно двигаемым, изменяющим размеры и правильно максимизирующимся на рабочем столе.
Я беру обычну форму BorderStyle = Sizeable, делаю override её свойства CreateParams и выставляю там флаги: WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_SYSMENU, WS_THICKFRAME
Получается форма без заголовка с тонкой системной sizeable-рамкой и с системным меню, в котором включены стандартные действия: Move, Maximize, Minimize, Сlose.
Ну реализация кнопок максимизации, минимизации и закрытия формы тривиальна.
Вопросы:
1) Что делать с перемещением формы? Т.е. при нажатии мышью в некоторой области формы (собственной реализации заголовке) форма должна двигаться вместе с мышью. Обращаю внимание, что смена Location формы - неправильное решение. Так как в Windows в режиме "перетаскивать содержимое окна при перемещении" такой подход ещё может сработать, а вот в старом режиме, когда появляется двигающаяся рамка нового положения окна, такой подход уже не работает. Вернее работает, но "отрывается от коллектива" - такой режим включается там, где запрещена интенсивная графика (на дохлых машинах или при работе через Remote Desktop), и в этом смысле приложение должно вести себя адекватно.
Была у меня идея послать в WndProc собственноручно собранный Message WM_SYSCOMMAND SC_MOVE (аналог выбора Move в системном меню). Однако почему-то ничего не происходит ни при посылке в WndProc, ни в DefWndProc. При выборе Move в системном меню появляется нужная рамка, но двигается она лишь клавиатурой, а мышью не двигается.
2) При максимизации такого окна, оно распахивается в full screen, скрывая task bar. Вот это тоже нежелательное явление, и хочется от него избавиться. Как?
|