Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ownerdraw menu, Каким способом лучше ? 
:(
    Опции темы
 
Выберите вариант
1. [ 0 ]  [0.00%]
2. [ 1 ]  [50.00%]
3. что-то другое [ 1 ]  [50.00%]
Всего проголосовавших: 2
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
Nastya
Дата 2.10.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Итак задача сделать красивенькие меню (причем как системное, так и попап (контекстное))
Можне решить 2-мя способами:
1. Каким-то боком через хуки или еще чего, зная имя класса окна #32768. Получить HWND меню и подставить ему другую WNDPROC. Там уже резвится в паинте
2. Вместо меню подсунуть диаложек, ну очень на него  похожий с овнердровавскими кнопочками. Но тут траблы со стилем диаложка, должен быть он popup, но при этом при появлении родительское окно должно выглядить как активное (вопрос как????) 
Кроме того соотвествнно при работе с таким меню прийдется работать как с диалогом, хорошо это или плохо не знаю.

Выбор варианта, плиз, обоснуйте. 
Если есть еще идеи, пишите smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Earnest
Дата 2.10.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Первый вариант не проходит, т.к. меню - это не окно, и нет у него никакого hWnd и никакой оконной процедуры. Можно в стандартном меню кое-что менять самому, но очень ограниченно.

Остается только второй вариант, только не диаложек, конечно, а просто поп-ап окно. Что тут может быть третье (не окно и не меню - не представляю).
Траблов много: нужно корректно отслеживать потерю фокуса, capture, черта лысого... Но все они решаемы. Что подтверждает масса коммерческих и не очень библиотек, использующих именно этот метод. Вот, скажем, BCG, которую я использую, делает именно так.

Та проблема, на которую ты указала, в MFC, например, решается силовым методом: введен дополнительный стиль поп-апов SYNACTIVE, у главного окна при потери активности из-за такого поп-апа нагло возвращается активный заголовок. Как-то так.  
Т.е. самопальное меню на основе окна не может существовать в вакууме само по себе: ему нужен минимальный фреймворк, который будет его поддерживать.

Добавлено @ 16:06 
Ну, в общем, меню итем можно сделать OwnerDraw, хотя это и не окно. Рисовать его тогда должно окно, которое им владеет. Не знаю в каких пределах можно извращаться, но ясно одно: нужно придумать способ отделения кода рисования меню от окна, что-то типа Reflection в MFC, иначе овчинка не стоит выделки.
Тоже меню совсем отдельно не напишешь (нужна какая-то поддерживающая оболочка).



Это сообщение отредактировал(а) Earnest - 2.10.2006, 16:01


--------------------
...
PM   Вверх
Nastya
Дата 2.10.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Цитата

Первый вариант не проходит, т.к. меню - это не окно, и нет у него никакого hWnd и никакой оконной процедуры

Как оказывается есть, если бы не было тогда что бы было бы вторым параметром в WM_ENTERIDLE при показе меню?
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxreference/dialogboxmessages/wm_enteridle.htm

У меня даже есть опенсоурсный классик, который как раз ставит хуки и отлавливает HWND меню а потом меняет его WNDPROC. Но мне как-то не хочется у себя самой же хуки ставить бр-р-р smile

Добавлено @ 16:16 
Цитата

Та проблема, на которую ты указала, в MFC, например, решается силовым методом: введен дополнительный стиль поп-апов SYNACTIVE

Ой, а что за стиль такой, я его не MSDN не нахожу smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Earnest
Дата 2.10.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Nastya @  2.10.2006,  17:11 Найти цитируемый пост)
Как оказывается есть, если бы не было тогда что бы было бы вторым параметром в WM_ENTERIDLE при показе меню?

WM_ENTERIDLE приходит не только при показе меню, но и при входе в модальный диалог, когда в нем все устаканится. А если меню, то там хандл окна-владельца:
Цитата

Handle to the dialog box (if wParam is MSGF_DIALOGBOX) or window containing the displayed menu (if wParam is MSGF_MENU). 


Цитата(Nastya @  2.10.2006,  17:11 Найти цитируемый пост)
У меня даже есть опенсоурсный классик, который как раз ставит хуки и отлавливает HWND меню 

Хм... ну кто их знает, может оно и реализовано в глубине души как окно... никогда не сталкивалась...

Цитата(Nastya @  2.10.2006,  17:11 Найти цитируемый пост)
Ой, а что за стиль такой, я его не MSDN не нахожу 

Правильное имя MFS_SYNCACTIVE...


--------------------
...
PM   Вверх
Nastya
Дата 3.10.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Цитата

Правильное имя MFS_SYNCACTIVE...


Если я правильно поняла, то что бы работал этот штук, надо что бы и родительское и дочернее окна наследовались от каких-то специальных MFC - шных классов.
такой код: эффекта не дает :
Код

    m_SysMenu.Create(IDD_SYSMENU, this->GetParent());
    LONG style = ::GetWindowLongPtr(m_SysMenu.m_hWnd, GWL_STYLE);
    LONG old = ::SetWindowLongPtr(m_SysMenu.m_hWnd, GWL_STYLE, style | MFS_SYNCACTIVE);
    


Добавлено @ 11:39 
http://www.rsdn.ru/Forum/Message.aspx?mid=642366 - вот тут кое-чего по этому поводу smile

Сорри за офтоп, ну до чего же все коряво - то, а?

Добавлено @ 11:39 
Я пытаюсь выкрутится через SW_SHOWNA smile посмотрим че получится smile



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
GremlinProg
Дата 3.10.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



На самом деле, меню - это тоже окно, только совсем не потому, что в функциях меню фигурирует HWND, а потому что существует MSDN: http://msdn.microsoft.com/library/en-us/wi...ame=true#system
Но чтобы слепить красивое меню, достаточно и простого окна.
Цитата(Nastya @  2.10.2006,  17:37 Найти цитируемый пост)
но при этом при появлении родительское окно должно выглядить как активное (вопрос как????) 

это решается перехватом сообщения WM_NCACTIVATE у главного окна. wParam = FALSE, если окно деактивируется и TRUE при активации. Активность можно сохранить перехватив момент деактивации, в этом случае lParam будет указывать на дескриптор окна, которое собирается быть активировано. Нужно просто сравнить этот дескриптор с вашим попап-окном(новоявленным меню) и если они совпадают, то вернуть TRUE, не вызывая DefWindowProc и т.п.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 3.10.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Nastya @  3.10.2006,  12:38 Найти цитируемый пост)
такой код: эффекта не дает :

Естественно, я ведь писала, что нужна поддержка со стороны главного окна. А WinAPI вообще про этот стиль не знает.
Ну вот GremlinProg написал, как. Т.е. если не MFC, то можно сделать что-то подобное.




--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.