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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: не могу внести изменения в SubMenu  (Прочитано 10148 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
duritskiy
Гость
« : 05-10-2004 07:40 » new

Код: (C++)
HMENU hMenu = GetMenu(Form1->Handle);

for(int i=0;i<GetMenuItemCount(hMenu);i++)
{

    EnableMenuItem( hMenu, i,   MF_ENABLED | MF_BYPOSITION       );
    //здесь менюшки энаблятся


    HMENU hSubMenu = GetSubMenu( hMenu, i );

    if(hSubMenu!=NULL)
    {

        for(int j=0;j<GetMenuItemCount(hSubMenu);j++)
        {
             EnableMenuItem( hSubMenu, j,   MF_ENABLED | MF_BYPOSITION   );
           
            //а здесь почему-то не энаблятся

            char str[20];
            GetMenuString( hSubMenu,  j, str, 29, MF_BYPOSITION);
            ListBox1->Items->Add(str);
        }
    }


Помогите разобраться с этой напастью.
Просьба дать хотябы один примерчик.
« Последнее редактирование: 08-12-2010 11:02 от Вад » Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #1 : 06-10-2004 05:37 » 

Вообще если я не ошибаюсь менюшки обычно энаблятся по ON_UPDATE_COMMAND_UI :?
Например
Код:
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCut)

void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)
{
if((m_Editor.m_FocusNum==666)&&(!m_Editor.m_MultySelect)) pCmdUI->Enable(false);else pCmdUI->Enable();
}
« Последнее редактирование: 08-12-2010 11:03 от Вад » Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
duritskiy
Гость
« Ответ #2 : 06-10-2004 20:41 » 

Спасибо за совет, но помоему он не подходит.
   Вообщето я хочу сделать так:
Если в каком-то, нужном мне приложении есть менюшка с некоторыми отключёнными подменюшками, запускаю свою функцию, она определяет хэндл менюшки, пробелается по её дереву и включает все вложенные менюшки.
Вот такая задача.

С помощью EnableMenuItem() и SetMenuItemInfo() у меня ничего не получилось.
Хотя возможно что-то не так делал, и такое бывало Улыбаюсь
Записан
kisilevski
Постоялец

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

WWW
« Ответ #3 : 14-10-2004 13:01 » 

При работе с контекстным меню (обработка примерно такая же) я не дисаблю, а удаляю те пункты меню, которые не следует давать тыркать пользователю:

Код:

pMenu->DeleteMenu)ID_OTHER_DEL, MF_BYCOMMAND:;


, где ID_OTHER_DEL - это ID ресурса пункта меню, а MF_BYCOMMAND - с этим компилятор сам знает, что делать.
Записан

Ложки нет. See MSDN for details.
Mad
Гость
« Ответ #4 : 16-10-2004 12:10 » 

Цитата: duritskiy
Если в каком-то, нужном мне приложении есть менюшка с некоторыми отключёнными подменюшками, запускаю свою функцию, она определяет хэндл менюшки, пробелается по её дереву и включает все вложенные менюшки.


После чего запускается функция ON_COMMANDUI_UPDATE "нужного приложения" и дисаблет все, тока проэнабленные менюшки  Отлично
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 08-12-2010 10:00 » 

MFC:
Тоже столкнулся - главное меню фрейма создано динамически, все пункты серые.

вот так

Код:
//перенаправлено из theApp
BOOL CMainFrame::OnIdle(LONG lCount)
{
//обновить состояние пунктов меню
GetMenu()->CheckMenuItem(4,MF_BYCOMMAND|MF_CHECKED);
GetMenu()->EnableMenuItem(4,MF_BYCOMMAND|MF_ENABLED);
}

галочка у пунктов с ID==4 ставится исправно, а вот пункт доступным не становится. Видимо, где-то потом вырубаются пункты, но не могу понять - где, и как это обойти ?
Записан

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

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


« Ответ #6 : 10-12-2010 06:29 » 

Всё! Был пнут Джоном в правильную сторону, и получилось вот что

Код:
enum ee_commands_id_range
{
e_commands_id_range_min=1,
e_commands_id_range_max=200,
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND_RANGE          (e_commands_id_range_min,e_commands_id_range_max, &OnMenuCom)
ON_UPDATE_COMMAND_UI_RANGE(e_commands_id_range_min,e_commands_id_range_max, &OnMenuUpd)
END_MESSAGE_MAP()


void CMainFrame::OnMenuCom(UINT i)
{
}

void CMainFrame::OnMenuUpd(CCmdUI* ui)
{
}


теперь команды из этого диапазона в менюшке можно создавать в рантайме
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines