Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как сделать изменение состояния Check в меню, из диалога/другого класса?

20K
04 сентября 2008 года
krist
33 / / 09.08.2007
Привет!
Подскажите как из другого диалога изменить состояние одного пункта меню (и соотв. кнопки на панели инструментов ) MF_CHECKED->MF_UNCHECKED?

Делаю так:
 
Код:
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
CMenu* pSubMenu = pMenu->GetSubMenu(0);    
pSubMenu->CheckMenuItem(ID_LOG_TR, MF_UNCHECKED);

Но ничего не происходит...
20K
05 сентября 2008 года
krist
33 / / 09.08.2007
Может это не так делается, и я иду не в том направлении? Очень надо...
14
05 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Помню в MFC сообщение есть какое-то вроде UPDATE_UI, там нужно выставлять состояние пунктов меню..
20K
06 сентября 2008 года
krist
33 / / 09.08.2007
Может по другому называется? UPDATE_UI нигде не встречается...
288
06 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
[QUOTE=krist]
Привет!
Подскажите как из другого диалога изменить состояние одного пункта меню (и соотв. кнопки на панели инструментов ) MF_CHECKED->MF_UNCHECKED?

Делаю так:
Код:
 
Код:
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
CMenu* pSubMenu = pMenu->GetSubMenu(0);    
pSubMenu->CheckMenuItem(ID_LOG_TR, MF_UNCHECKED);

Но ничего не происходит...
[/QUOTE]

Ошибка скорее всего здесь
 
Код:
pSubMenu->CheckMenuItem(ID_LOG_TR, MF_UNCHECKED | MF_BYCOMMAND);
288
06 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: krist
Может по другому называется? UPDATE_UI нигде не встречается...



Если хотите использовать этот способ, то в вашем MESSAGE MAP'е (в классе окна "хозяина" меню) должна быть строка что-то вроде этой

 
Код:
ON_UPDATE_COMMAND_UI(ID_LOG_TR, OnUpdateLogTR)


А функция OnUpdateLogTR будет представлять из себя следующее
 
Код:
................................................................
afx_msg void OnUpdateLogTR(CCmdUI *pCmdUI);
................................................................
void CMyClass::OnUpdateLogTR(CCmdUI *pCmdUI)
{
    pCmdUI->SetCheck(bNeedCheck);
}


Ну и соотвественно обработчик щелчка по этому пункту меню будет выглядеть приблизительно так
 
Код:
bNeedCheck = !bNeedCheck;
20K
06 сентября 2008 года
krist
33 / / 09.08.2007
Я так и делаю:
 
Код:
void    CLogView::OnUpdateLogTmp(CCmdUI *pCmdUI)
{

    ( m_bLogActive ) ? ( pCmdUI->SetCheck(1) )  : ( pCmdUI->SetCheck(0) ) ;

}

Но так я могу только сделать в классе который обрабатывает этот пункт меню, a как сделать это из другого класса???
Вызвать эту функцию напрямую не получится... или я ошибаюсь? Если да то поправьте.
288
06 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: krist
Я так и делаю:
 
Код:
void    CLogView::OnUpdateLogTmp(CCmdUI *pCmdUI)
{

    ( m_bLogActive ) ? ( pCmdUI->SetCheck(1) )  : ( pCmdUI->SetCheck(0) ) ;

}

Но так я могу только сделать в классе который обрабатывает этот пункт меню, a как сделать это из другого класса???
Вызвать эту функцию напрямую не получится... или я ошибаюсь? Если да то поправьте.



Этот обработчик вызывается каждый раз, когда необходимо обновить меню. Т.е. обычно при открытии меню. Так что, если вы дадите доступ к переменной m_bLogActive другому классу и в этом другом классе будете изменять ее значение, то эти изменения отразятся и на пункте меню.

20K
06 сентября 2008 года
krist
33 / / 09.08.2007
ОК делаем m_bLogActive глобальной переменной, но тогда как другой класс узнает, что она изменилась? Кто-то должен постоянно опрашивать состояние переменной m_bLogActive, или я не прав.
288
06 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: krist
ОК делаем m_bLogActive глобальной переменной, но тогда как другой класс узнает, что она изменилась? Кто-то должен постоянно опрашивать состояние переменной m_bLogActive, или я не прав.



Или я вас не понял или вы меня :)
Т.е. вы имеете в виду, что когда пользователь снимет(поставит) флажок с пункта меню в другом классе должно что-то призойти?
Опишите поподробней, в чем собственно заключается задача.

20K
06 сентября 2008 года
krist
33 / / 09.08.2007
Задача:
пользователь нажимает в панели инструментов кнопку "Лог" (в меню такой же пункт с одинаковым идентификатором, типа галочки перед "Строка состояния" в меню Вид) и она становится "checked" () т.е. как бы нажатой. Откравается диалоговое окно другого класса, для выбора настроек, но пользователь передумал и нажал на кнопку в диалоге: закрыть. Теперь мне нужно вернуть состояние кнопки "Лог" в состояние "unchecked" прежде чем закрыть диалог. В классе где обрабатывается нажатие кнопки "Лог" делается элементарно при помощи
CLogView::OnUpdateLogTmp(CCmdUI *pCmdUI) проверкой состояния переменной m_bLogActive в TRUE или FALSE.
Как выполнить OnUpdateLogTmp в чужом классе? Или как нибудь по другому перевести в состояние unchecked?
288
06 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: krist
Задача:
пользователь нажимает в панели инструментов кнопку "Лог" (в меню такой же пункт с одинаковым идентификатором, типа галочки перед "Строка состояния" в меню Вид) и она становится "checked" () т.е. как бы нажатой. Откравается диалоговое окно другого класса, для выбора настроек, но пользователь передумал и нажал на кнопку в диалоге: закрыть. Теперь мне нужно вернуть состояние кнопки "Лог" в состояние "unchecked" прежде чем закрыть диалог. В классе где обрабатывается нажатие кнопки "Лог" делается элементарно при помощи
CLogView::OnUpdateLogTmp(CCmdUI *pCmdUI) проверкой состояния переменной m_bLogActive в TRUE или FALSE.
Как выполнить OnUpdateLogTmp в чужом классе? Или как нибудь по другому перевести в состояние unchecked?



Ну тогда я не понял в чем собственно проблема. Функцию CLogView::OnUpdateLogTmp(CCmdUI *pCmdUI) самому вызывать не надо. Просто проверяете результат выполнения диалога, и если он отрицательный, тогда выставляете m_bLogActive в FALSE. CLogView::OnUpdateLogTmp(CCmdUI *pCmdUI) будет вызван при первой же попытке открыть меню (ну и конечно при всех последующих) и согласует состояние элемента меню с переменной m_bLogActive. Вот и все.

20K
07 сентября 2008 года
krist
33 / / 09.08.2007
Спасибо! Это частично решило проблему. Но все таки возможно ли как нибудь изменить состояние элемента меню из другого класса?
К примеру все прошло ОК, пользователь все выбрал все запустил, лог идет, но происходит ошибка при записи данных в файл. Я отлавливаю эту ошибку через try/catch и мне теперь нужно вернуть в состояние unchecked кнопку "Лог"...
288
08 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: krist
Спасибо! Это частично решило проблему. Но все таки возможно ли как нибудь изменить состояние элемента меню из другого класса?
К примеру все прошло ОК, пользователь все выбрал все запустил, лог идет, но происходит ошибка при записи данных в файл. Я отлавливаю эту ошибку через try/catch и мне теперь нужно вернуть в состояние unchecked кнопку "Лог"...



Присвойте члену первого класса m_bLogActive значение false из любого метода второго класса и кнопка "Лог" вернется в состояние unchecked

20K
08 сентября 2008 года
krist
33 / / 09.08.2007
Спасибо! Буду тестить...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог