ann_nef
|
|
« : 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_, те к нему надо подобраться через номер позиции в меню. А как? Пока не нашла…
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #3 : 13-06-2013 07:36 » |
|
Джон, точно ) Так проще
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #5 : 13-06-2013 08:01 » |
|
это же АПИ. Я даже так делал, помнится
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 13-06-2013 08:08 » |
|
Вопрос в том, об флажок 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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #9 : 13-06-2013 08:49 » |
|
Спасибо! Всё получилось. ЧТД.
|
|
« Последнее редактирование: 13-06-2013 09:05 от ann_nef »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #10 : 13-06-2013 09:01 » |
|
ann_nef, только вотку не пей )
|
|
|
Записан
|
|
|
|
ann_nef
|
|
« Ответ #11 : 13-06-2013 09:07 » |
|
Хорошо, буду пить красное сухое вино, плавая на т/х и любуясь с друзьями на наш красивый город - Санкт-Петербург.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #12 : 13-06-2013 09:14 » |
|
боюсь уточнять, что такое т/х ))))
|
|
|
Записан
|
|
|
|
ann_nef
|
|
« Ответ #13 : 13-06-2013 09:19 » |
|
Всего навсего теплоход, который по каналам и рекам ходит. Обычное питерское развлечение
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #14 : 13-06-2013 09:20 » |
|
|
|
|
Записан
|
|
|
|
ann_nef
|
|
« Ответ #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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #16 : 29-10-2013 08:51 » |
|
Наверно, что меню (или даже его пункт) - это отдельный window.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #17 : 29-10-2013 09:09 » |
|
Напрямую ответить - мало инфы. Что, где, как? Встречный вопрос: почему у тебя такие заморочки с меню? Ведь у тебя нормальное MFC приложение. Для работы с меню есть определённые, очень простые, функции. В частности, для твоей задачи решается просто: добавляем ф-ю обработки сообщения UPDATE_COMMAND_UI в .h void OnUpdateMyMenuItem(CCmdUI* pCmdUI); в MESSAGE_MAP ON_UPDATE_COMMAND_UI(ID_Menu1, OnUpdateMyMenuItem) в .cpp 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
|
|
« Ответ #18 : 29-10-2013 09:55 » |
|
Джон,спасибо, как всегда. за помощь. Только после твоей подсказки увидела, что есть такое сообщение UPDATE_COMMAND_UI в MFC.
|
|
« Последнее редактирование: 29-10-2013 10:08 от ann_nef »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 29-10-2013 10:24 » |
|
А как ты вобще создаёшь проект? Ведь если использовать мастер, например, SDI или MDI, то эти ф-ции уже находятся в коде и их можно "пощупать". зы в качестве бонуса. Если у тебя много пунктов меню, ID которых идут по порядку, и которые имеют одинаковую логику отображения, то, чтобы не писать кучу одинаковых ф-ций, можно использовать ON_UPDATE_COMMAND_UI_RANGE например: 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
|
|
« Ответ #20 : 30-10-2013 05:03 » |
|
Джон, я действительно использую мастер. В текущей задаче меню простое, всего 3 пункта. Но, поиграюсь, чтобы осталось в памяти. Мб тогда вас и беспокоить не придётся по пустякам.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #21 : 30-10-2013 05:49 » |
|
Наверно, что меню (или даже его пункт) - это отдельный window.
не, окно меню - это один HWND-объект, пункты нарисованы Аня, Джон - а я обновляю окно меню попроще (если после выбора пункта нужно поменять вид меню) - заново его вывожу
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #23 : 30-10-2013 07:34 » |
|
Джон, ну, скажем так, ещё не отображается, ведь апдейт для команд я не прописывал )) Ну и состав меню тоже у меня менялся, не только доступность пунктов
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
|