asker
|
|
« : 15-05-2006 12:55 » |
|
Есть диалог, к нему подкючается меню. Допустим при выбора одного пункта блокируется другой (становится не доступным) Сейчас это сделано так: void CApp::OnUpdateUsersLogin(CCmdUI *pCmdUI) { pCmdUI->Enable(!m_bIsLogin); }
Есть 1 НО. Если m_bIsLogin == true, то при выборе пункта меню реакции никакой нет, но сам пункт меню не выглядит как не доступный. Вопрос: как сделать чтобы пункт меню еще и выглядел как не доступный? Подскажите пожалуйста, что не так.
|
|
|
Записан
|
С уважением, asker
|
|
|
Malaja
|
|
« Ответ #1 : 15-05-2006 15:08 » |
|
asker,
сейчас попробовала - у меня в классе View стоит такой код:
[] void CStandSteuerView::OnUpdateMenuTest11(CCmdUI* pCmdUI) { pCmdUI->Enable(FALSE); } []
и все работает как надо. Насколько я понимаю, тебе надо убрать этот код из CApp и положить во View или MainFrame. очень похоже, что сообщение Enable() не полностью обрабатывается.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 15-05-2006 15:26 » |
|
Иринкин, во вьюшке-то прокатывает , а в диалоге - действительно не получается. То же касается и поставить чек возле пункта Тоже бы хотел узнать, как...
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #3 : 15-05-2006 15:32 » |
|
Я не знаю тонкостей. Но может надо просто UpDate сделать для данного контрола.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Malaja
|
|
« Ответ #4 : 15-05-2006 15:38 » |
|
Леш, у меня такое впечатление, что и не прокатит... Ведь все сообщения идут через MainFrame и/или View, а диалог-дочернее окно, посему запросто может статься, что он недополучает от родителей какие-то сообщения, т.к. эти самые родители их сами обрабатывают. Я с этим стокнулась, когда посылала сообщения между приложениями. В каждом было по диалогу и они обменивались периодически смс-ками в виде сообщений. Так вот пока я не затащила все основные обработчики в MainFrame, ничего не вышло.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 15-05-2006 16:02 » |
|
так сообщения-то, помнится, доходят (щас не проверял) , только пункты не реагируют
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 15-05-2006 16:04 » |
|
Ирин, а насчёт обработчиков сообщений WM_COPYDATA - это какой хендл передашь ж)
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #7 : 16-05-2006 06:49 » |
|
Леш, в самом хреновом случае - HWND_BROADCAST... Но это может ооочень плохо кончиться Вторая возможность - зная имя окна, искать его с помощью FindWindow("window_name"). Но я использовала вообще другой путь - я объявляла сообщение, регистрировала его, а затем уже посылала куда надо
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
asker
|
|
« Ответ #8 : 16-05-2006 08:49 » |
|
Malaja, если есть MainFrame - это хорошо, но у меня приложение на основе Dialog box. Алексей1153 сообщения доходят, я прверял, просто нет визуального отображения, что пункт блокирован. А можно спросить, а присем тут WM_COPYDATA, ведь насколько я понял из MSDN это сообщение позволяет передавать данные из одного приложения в другое.
|
|
|
Записан
|
С уважением, asker
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 16-05-2006 08:52 » |
|
(извиняюсь за офтоп) Offtopic: Ирина, ты что-то путаешь.. У меня в длл - переменная для хранения хендла. Когда занружаю длл - передаю хендл диалога, потом длл посылает данные через WM_COPYDATA хендлу - всё нормально доходит Пример прислать? Поставлю в угол.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 16-05-2006 08:54 » |
|
asker, так я знаю, что доходят - я про это писал . Полностью согласен с тобой. А WM_COPYDATA - это мы с Ириной офтопим, не обращай внимания
|
|
|
Записан
|
|
|
|
asker
|
|
« Ответ #11 : 16-05-2006 09:21 » |
|
А как вручную поменять цвет текста в пункте меню
|
|
|
Записан
|
С уважением, asker
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 16-05-2006 11:37 » |
|
Я не знаю тонкостей. Но может надо просто UpDate сделать для данного контрола.
Абсолютно правильное решение. В диалоге у меню нет апдейта. Для этого можно воспользоваться трюком - делать апдейт по WM_KICKIDLE 1. добавляем в .h afx_msg LRESULT OnKickIdle(WPARAM, LPARAM);
2. добавляем в .cpp #include <afxpriv.h> в MESSAGE_MAP - ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
и саму ф-ю LRESULT CTestDlg::OnKickIdle(WPARAM, LPARAM) { CMenu* pMainMenu = GetMenu(); CCmdUI cmdUI; for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); ++n) { CMenu* pSubMenu = pMainMenu->GetSubMenu(n); cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount(); for (UINT i = 0; i < cmdUI.m_nIndexMax;++i) { cmdUI.m_nIndex = i; cmdUI.m_nID = pSubMenu->GetMenuItemID(i); cmdUI.m_pMenu = pSubMenu; cmdUI.DoUpdate(this, FALSE); } } return TRUE; }
А как вручную поменять цвет текста в пункте меню
Если ты хотел только для этого, то лучше воспользуйся методом описанным выше. Иначе надо будет делать своё меню. зы Лёш, для чекбокса тоже самое
|
|
« Последнее редактирование: 17-05-2006 09:34 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Malaja
|
|
« Ответ #13 : 16-05-2006 14:36 » |
|
Мальчики,
если я обрабатываю сообщения меню в основном классе (у меня CDlg_based_menuApp), то все нормально. Если надо, скину пример.
________ Леш,
может, мы говорим о разных вещах? Если можешь, скинь мне примерчик на мой адрес, я посмотрю.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
asker
|
|
« Ответ #14 : 17-05-2006 07:07 » |
|
Джон, все работает (правда надо в stdafx добавить инклуд #include <afxpriv.h>) Спасибо
Malaja, ты имеешь в виду сообщения update_command_ui для пунктов меню?
|
|
|
Записан
|
С уважением, asker
|
|
|
asker
|
|
« Ответ #15 : 17-05-2006 07:33 » |
|
Джон, и еще вопрос (уточнение) про WM_KICKIDLE, оно посылается модальными окнами когда очередь сообщений пуста или я не совсем правильно понимаю
|
|
|
Записан
|
С уважением, asker
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #16 : 17-05-2006 09:25 » |
|
правда надо в stdafx добавить инклуд #include <afxpriv.h>
Блин, конечно - забыл. В принципе достаточно в .срр диалога. Если же таких диалогов много, то лучше сделать родительский класс с этой ф-ей. Джон, и еще вопрос (уточнение) про WM_KICKIDLE, оно посылается модальными окнами когда очередь сообщений пуста или я не совсем правильно понимаю
В принципе правильно - это сообщение всегда посылается диалогу если он ничего не делает. тн idle состояние. Подробней про апдейт в диалогах можешь почитать здесь: http://www.ddj.com/dept/windows/184416462зы Совсем забыл - это MFC сообщение. Эквивалент, или замена WM_IDLE, который не передаётся модальным диалогам.
|
|
« Последнее редактирование: 17-05-2006 09:27 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
asker
|
|
« Ответ #17 : 19-05-2006 10:35 » |
|
Джон пойду по ссылке ...
Еще раз спасибо все спасибо
|
|
|
Записан
|
С уважением, asker
|
|
|
|