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

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

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

« : 13-06-2013 06:15 » 

Помогите, пожалуйста, ещё раз.

Пишу в visual c++ 6.

Нужно сделать неактивным, серым пункт меню POPUP.

Как сделать тоже самое с пунктами не POPUP, я знаю.
Примерно так:

CMenu *mnu = this->GetMenu();
mnu->EnableMenuItem(ID_step1, MF_DISABLT|MF_GRAYED);
mnu->EnableMenuItem(ID_step2, MF_DISABLT|MF_GRAYED);
….

У пункта меню POPUP нет ID_,  те к нему надо подобраться через номер позиции
в меню.
А как? Пока не нашла…
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 13-06-2013 07:34 » 

думается, нужно перешуршать все элементы по позиции при помощи цикла и функции http://msdn.microsoft.com/en-US/library/kwkkkww5(v=vs.80).aspx

причём, флажок BOOL fByPos пусть задаёт именно позицию, а не ID , так как в меню может быть и более одного элемента с этим ID Улыбаюсь

поэтому, перебираем все позиции и сравниваем по lpMenuItemInfo->wID
Записан

Джон
просто
Администратор

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

« Ответ #2 : 13-06-2013 07:35 » 

Попробуй вместо ID_step1 указать позицию и добавь к флажкам MF_BYPOSITION -> MF_DISABLED|MF_GRAYED|MF_BYPOSITION
« Последнее редактирование: 13-06-2013 07:50 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 13-06-2013 07:36 » 

Джон, точно ) Так проще
Записан

Джон
просто
Администратор

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

« Ответ #4 : 13-06-2013 07:51 » 

Я только не знаю, об это в шестёрке работает.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 13-06-2013 08:01 » 

это же АПИ. Я даже так делал, помнится
Записан

Джон
просто
Администратор

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

« Ответ #6 : 13-06-2013 08:08 » new

Вопрос в том, об флажок MF_BYPOSITION известен в 4.2 и/или какой WINVER надо для него определить. У меня ща под рукой уже ничего нет с тех времён, чтобы проверить.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 13-06-2013 08:12 » 

шестёрка понимает эти флаги

Цитата
/* ;win40  -- A lot of MF_* flags have been renamed as MFT_* and MFS_* flags */
/*
 * Menu flags for Add/Check/EnableMenuItem()
 */
#define MF_INSERT           0x00000000L
#define MF_CHANGE           0x00000080L
#define MF_APPEND           0x00000100L
#define MF_DELETE           0x00000200L
#define MF_REMOVE           0x00001000L

#define MF_BYCOMMAND        0x00000000L
#define MF_BYPOSITION       0x00000400L


#define MF_SEPARATOR        0x00000800L

#define MF_ENABLED          0x00000000L
#define MF_GRAYED           0x00000001L
#define MF_DISABLED         0x00000002L

#define MF_UNCHECKED        0x00000000L
#define MF_CHECKED          0x00000008L
#define MF_USECHECKBITMAPS  0x00000200L

#define MF_STRING           0x00000000L
#define MF_BITMAP           0x00000004L
#define MF_OWNERDRAW        0x00000100L

#define MF_POPUP            0x00000010L
#define MF_MENUBARBREAK     0x00000020L
#define MF_MENUBREAK        0x00000040L

#define MF_UNHILITE         0x00000000L
#define MF_HILITE           0x00000080L

Записан

Джон
просто
Администратор

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

« Ответ #8 : 13-06-2013 08:23 » 

Тогда всё в порядке.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

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

« Ответ #9 : 13-06-2013 08:49 » 

Спасибо!
Всё получилось.
ЧТД. Улыбаюсь
« Последнее редактирование: 13-06-2013 09:05 от ann_nef » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #10 : 13-06-2013 09:01 » 

ann_nef, только вотку не пей )
Записан

ann_nef
Помогающий

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

« Ответ #11 : 13-06-2013 09:07 » 

Хорошо, буду пить красное сухое вино, плавая на т/х и любуясь с друзьями на наш красивый город - Санкт-Петербург.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #12 : 13-06-2013 09:14 » 

боюсь уточнять, что такое т/х ))))
Записан

ann_nef
Помогающий

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

« Ответ #13 : 13-06-2013 09:19 » 

Всего навсего теплоход, который по каналам и рекам ходит. Обычное питерское развлечение Скромно так...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #14 : 13-06-2013 09:20 » 

Улыбаюсь
Записан

ann_nef
Помогающий

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

« Ответ #15 : 29-10-2013 06:29 » 

Помогите разобраться, пста.
Вопрос опять возник о управлени пунктов меню.

CMenu *mnu;
mnu->EnableMenuItem(ID_Menu1, MF_GRAYED);

Пункт меню с ID_Menu1 становится серым только, если щелкнуть по этому пункту меню.
Аналогично, если сразу описать его серым, а потом сделать активным,
то он становится доступным для выполнения,но цвет меняется после щелчка кнопкой мыши.

Пыталась обновить экран UpdateData(false)/Invalidate(TRUE)/ UpdateWindow(TRUE) - не помогло.

Что я упускаю?

« Последнее редактирование: 29-10-2013 06:41 от ann_nef » Записан
Dimka
Деятель
Команда клуба

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

« Ответ #16 : 29-10-2013 08:51 » 

Наверно, что меню (или даже его пункт) - это отдельный window.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #17 : 29-10-2013 09:09 » 

Напрямую ответить - мало инфы. Что, где, как?

Встречный вопрос: почему у тебя такие заморочки с меню? Ведь у тебя нормальное MFC приложение. Для работы с меню есть определённые, очень простые, функции. В частности, для твоей задачи решается просто:

добавляем ф-ю обработки сообщения UPDATE_COMMAND_UI

в .h
Код: (C++)
void OnUpdateMyMenuItem(CCmdUI* pCmdUI);

в MESSAGE_MAP
Код: (C++)
ON_UPDATE_COMMAND_UI(ID_Menu1, OnUpdateMyMenuItem)

в .cpp
Код: (C++)
void CMyWnd::OnUpdateMyMenuItem(CCmdUI *pCmdUI)
{
        BOOL bEnable = условие;
        pCmdUI->Enable(bEnable);

        // если хочешь отобразить "чек", то это делается так
        int  nCheck = условие ? 1 : 0;
        pCmdUI->SetCheck(nCheck);

}

и всё. Тебя такой вариант не устраивает?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

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

« Ответ #18 : 29-10-2013 09:55 » 

Джон,спасибо, как всегда. за помощь.
Только после твоей подсказки увидела, что есть такое сообщение UPDATE_COMMAND_UI в MFC. Краснею
« Последнее редактирование: 29-10-2013 10:08 от ann_nef » Записан
Джон
просто
Администратор

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

« Ответ #19 : 29-10-2013 10:24 » 

А как ты вобще создаёшь проект? Ведь если использовать мастер, например, SDI или MDI, то эти ф-ции уже находятся в коде и их можно "пощупать". Ага

зы в качестве бонуса. Ага Если у тебя много пунктов меню, ID которых идут по порядку, и которые имеют одинаковую логику отображения, то, чтобы не писать кучу одинаковых ф-ций, можно использовать ON_UPDATE_COMMAND_UI_RANGE

например:

Код: (C++)
ON_UPDATE_COMMAND_UI_RANGE(ID_MENU_1, ID_MENU_75, OnUpdateMyMenuRange)

где ID_MENU_1 и ID_MENU_75 - ID первого и последнего пунктов меню соответственно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

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

« Ответ #20 : 30-10-2013 05:03 » 

Джон, я действительно использую мастер.
В текущей задаче меню простое, всего 3 пункта.
Но, поиграюсь, чтобы осталось в памяти. Мб тогда вас и беспокоить не придётся по пустякам. Краснею
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #21 : 30-10-2013 05:49 » 

Наверно, что меню (или даже его пункт) - это отдельный window.
не, окно меню - это один HWND-объект, пункты нарисованы

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

Джон
просто
Администратор

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

« Ответ #22 : 30-10-2013 06:52 » 

а я обновляю окно меню попроще (если после выбора пункта нужно поменять вид меню) - заново его вывожу Отлично

Нууу проще в данном случае, это как через попу стеклорезом. Ага Зачем выводить его заново, если оно уже отображается в нужном состоянии?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #23 : 30-10-2013 07:34 » 

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

Джон
просто
Администратор

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

« Ответ #24 : 30-10-2013 16:29 » 

Ну... если очень хочется поиздеваться над меню, то есть на этот случай ф-я - OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu).
Она вызывается всякий раз перед тем как какое-нить меню (или сабменю) в программе раскроется. В этот момент с ним можно делать практически УСЁ. После этого оно будет показано в желаемом виде, без всяких дополнительных обновлений, или выводОв. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines