![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| evkwarrior |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 15.3.2007 Репутация: 1 Всего: 1 |
Всем доброго времени суток.
Тема, которую я затронул, давно изъезжена вдоль и поперёк, я нашёл в поиске более десятка тем со схожей тематикой, но нигде не было полного ответа на все вопросы. Я не буду лаконичен и постараюсь последовательно (по мере создания и совершенствования проекта) изложить основные проблемы, с которыми я столкнулся. 1) исходные данные: - чистый WinAPI - несколько готовых модулей на WinAPI, инкапсулирующих рутину, в т.ч. класс CLASS_GUIAPP, поведение методов которого будет ясно из контекста 2) предварительная задача: создать полупрозрачное окно нестандартной формы (желательно с дырками внутри) - окно должно быть изменяемым по размеру - желательно наличие рамки окна - должны быть видны изменения содержимого под окном при их изменении - должен быть предусмотрен механизм минимизации/максимизации окна. Иными словами, функциональность такого окна не должна ухудшаться в ущерб сложности реализации. 3) выбор метода решения проблемы. Прочитав не одну статью, я извлёк для себя две основных методики создания окон нестандартной формы с эффектами прозрачности: - создание обычного окна, SetWindowRgn и игра с регионами - создание окна со стилем WS_EX_LAYERED, создание картинки с предопределённым цветом в качестве прозрачного, загрузка картинки, работа с SetLayeredWindowAttributes или UpdateLayeredWindow. Решение 1 показалось мне более сложным из-за необходимости работы с регионами и выполнением с ними линейных преобразований (масштабирование, пересечение, исключение регионов т.д.) Поэтому я выбрал 2 метод. 4) Основной алгоритм:
Программу прикрепляю в приложении. В итоге получается 50% прозрачное окно нестандартной формы с дырками (выполнено основное требование) В оконной процедуре впринципе ничего не надо обрабатывать, кроме прорисовки окна. Так как окно голое, я делаю эту обработку в WM_ERASEBKND:
5) продожение. - Как сделать рамку? Я нашёл такое решение: сделать уже готовое изображение с рамкой, и дальше при изменении размеров вызывать StretchBlt. Но тогда ширина рамки будет меняться, что плохо. Другого решения я не нашёл.. Может, у кого-то есть идеи? - окно получается голым и надо продумать механизм его перемещения по столу и минимизации/максимизации Изменение позиции я реализовал с помощью перетаскивания окна в любом месте (этот код давно всем известен) А вот с эмуляцией системного меню я впал в ступор.... Была идея создать отдельно кнопки, но меня она не вдохновила... В одной SDK статье я когда-то мельком читал, что системное меню можно создать, как дочернее окно, зная его имя в системе, но заново найти статью мне не удалось... Ещё одна идея - это кнопка приложения на таскбаре. Если у программы есть системное меню, то щелкнув по кнопке в таскбаре правой кнопкой мыши можно вызвать контекстное меню, в котором есть системные команды.. Но у меня нет системного меню, и щелчки по таскбар кнопке вообще никак не воспринимаются системой 6) В общем в итоге я заступорился на сл вопросах: - как быть при изменении размера окна? - подспутный вопрос: придётся ли при приближении курсора к внешней границе региона окна самому реализовывать смену курсора на значок "двойная стрелка" и если придётся, то как лучше это сделать? - если реализовывать системные команды с помощью динамического создания системного меню в любом месте окна, то как это сделать? - если реализовывать системные команды с помощью обработки щелчков по кнопке приложения в таскбаре, то как отловить эти команды и что это за команды? Очень буду признателен за полноценные ответы. Присоединённый файл ( Кол-во скачиваний: 16 )
LayerWnd.zip 91,56 Kb |
||||
|
|||||
| jonie |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
используйте утилиту spy++ из поставки VS или скачайте тут: http://www.windows-spy.com/download/ и смотрите какие сообщения приходят окну. На них и реагируйте ) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||||
|
|||||||||
| mekhanikus |
|
||||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
В этом тебе поможет сама винда. Лови WM_NCHITTEST и возвращай соответсвующие значения. Винда сделает с курсором все, что нужно.
Если создать окно со стилем WS_SYSMENU, то отлавливая WM_NCRBUTTONDOWN в можно вызвать системное меню:
Это сообщение отредактировал(а) mekhanikus - 14.5.2009, 11:11 |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |