Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Блокирование элементов меню в диалоге  (Прочитано 18196 раз)
0 Пользователей и 1 Гость смотрят эту тему.
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« : 15-05-2006 12:55 » 

Есть диалог, к нему подкючается меню.
Допустим при выбора одного пункта блокируется другой (становится не доступным)

Сейчас это сделано так:
Код:
void CApp::OnUpdateUsersLogin(CCmdUI *pCmdUI)
{
pCmdUI->Enable(!m_bIsLogin);
}

Есть 1 НО. Если m_bIsLogin == true, то при выборе пункта меню реакции никакой нет, но сам пункт меню не выглядит как не доступный.

Вопрос: как сделать чтобы пункт меню еще и выглядел как не доступный?
Подскажите пожалуйста, что не так.
Записан

С уважением, asker
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #1 : 15-05-2006 15:08 » 

asker,

сейчас попробовала - у меня в классе View стоит такой код:

[]
void CStandSteuerView::OnUpdateMenuTest11(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(FALSE);
}
[]

и все работает как надо.
Насколько я понимаю, тебе надо убрать этот код из CApp и положить во View или MainFrame. очень похоже, что сообщение Enable() не полностью обрабатывается.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 15-05-2006 15:26 » 

Иринкин, во вьюшке-то прокатывает Улыбаюсь , а в диалоге - действительно не получается. То же касается и поставить чек возле пункта
Тоже бы хотел узнать, как...
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 15-05-2006 15:32 » 

Я не знаю тонкостей. Но может надо просто UpDate сделать для данного контрола.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 15-05-2006 15:38 » 

Леш,

у меня такое впечатление, что и не прокатит... Ведь все сообщения идут через MainFrame и/или View, а диалог-дочернее окно, посему запросто может статься, что он недополучает от родителей какие-то сообщения, т.к.  эти самые родители их сами обрабатывают.
Я с этим стокнулась, когда посылала сообщения между приложениями. В каждом было по диалогу и они обменивались периодически смс-ками Ага в виде сообщений. Так вот пока я не затащила все основные обработчики в MainFrame, ничего не вышло.

Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 15-05-2006 16:02 » 

так сообщения-то, помнится, доходят (щас не проверял) , только пункты не реагируют
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 15-05-2006 16:04 » 

Ирин, а насчёт обработчиков сообщений WM_COPYDATA - это какой хендл передашь ж)
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #7 : 16-05-2006 06:49 » 

Леш,

в самом хреновом случае - HWND_BROADCAST... Но это может ооочень плохо кончиться Ага
Вторая возможность - зная имя окна, искать его с помощью FindWindow("window_name").

Но я использовала вообще другой путь - я объявляла сообщение, регистрировала его, а затем уже посылала куда надо Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-05-2006 08:49 » 

Malaja, если есть MainFrame - это хорошо, но у меня приложение на основе Dialog box.
Алексей1153 сообщения доходят, я прверял, просто нет визуального отображения, что пункт блокирован.
А можно спросить, а присем тут WM_COPYDATA, ведь насколько я понял из MSDN это сообщение позволяет передавать данные из одного приложения в другое.
Записан

С уважением, asker
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 16-05-2006 08:52 » 

(извиняюсь за офтоп)
Offtopic:

Ирина, ты что-то путаешь.. У меня в длл - переменная для хранения хендла. Когда занружаю длл - передаю хендл диалога, потом длл посылает данные через WM_COPYDATA хендлу - всё нормально доходит Улыбаюсь
Пример прислать?
Поставлю в угол.
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 16-05-2006 08:54 » 

asker, так я знаю, что доходят - я про это писал Улыбаюсь . Полностью согласен с тобой. А WM_COPYDATA - это мы с Ириной офтопим, не обращай внимания Улыбаюсь
Записан

asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-05-2006 09:21 » 

А как вручную поменять цвет текста в пункте меню
Записан

С уважением, asker
Джон
просто
Администратор

de
Offline 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
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 16-05-2006 14:36 » 

Мальчики,

если я обрабатываю сообщения меню в основном классе (у меня CDlg_based_menuApp), то все нормально.
Если надо, скину пример.

________
Леш,

может, мы говорим о разных вещах? Если можешь, скинь мне примерчик на мой адрес, я посмотрю.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 17-05-2006 07:07 » 

Джон, все работает (правда надо в stdafx добавить инклуд #include <afxpriv.h>) Спасибо

Malaja, ты имеешь в виду сообщения update_command_ui для пунктов меню?
Записан

С уважением, asker
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 17-05-2006 07:33 » 

Джон, и еще вопрос (уточнение) про WM_KICKIDLE, оно посылается модальными окнами когда очередь сообщений пуста или я не совсем правильно понимаю
Записан

С уважением, asker
Джон
просто
Администратор

de
Offline 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
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 19-05-2006 10:35 » new

Джон пойду по ссылке ...

Еще раз спасибо все спасибо
Записан

С уважением, asker
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines