Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > MFC CMenu


Автор: Coocky 22.3.2004, 22:39
Да ли домашнее задание,перевести меню с аглицкого на русское.Меню содержит подменю.
Ну все понятно с реализацией,только ошибочка возникает...
Итак:работаю с AppWizard.Меню прикреплено изначально к диалогу.
И вот что происходит в программе:
[code] СMenu *pmenu;CMenu submenu;
submenu=pmenu->GetSubMenu ( int pos) //вот тут-то и отладчик дает ошибку : thisa нема(извините за Украинский язык smile.gif )
Че я только не делал :и присоединял меню вручную,и загружал и т.д.(даже с МСДН скатал код,как строчку подменять-всеравно void biggrin.gif )
Че делать?(А лучше код рабочий

Автор: Borisff2003 23.3.2004, 06:20
А вот так специально написанно
СMenu *pmenu;CMenu submenu;
или все же?
СMenu *pmenu;CMenu *submenu;

Автор: Coocky 23.3.2004, 16:33

Цитата
А вот так специально написанно
СMenu *pmenu;CMenu submenu;
или все же?
СMenu *pmenu;CMenu *submenu

Извините,господа,я торопился и поэтому забыл звезду поставить(я даже скобки не все поставил smile.gif ) Конечно,если прототип меню
Код
CMenu *GetSubMenu(int pos) const;//интересно а компилятор мне б позволил :D

Но я делал даже так
Код
submenu//обьект моего класса
CMenu *pmenu;
pmenu=submenu.GetSubMenu(int pos);//все равно-нето

Я ж даже с МСДН перекатывал
Ну короче,код для работы со строками субменю напишите(не забудьте:меню изначально присоеденено к окну диалога!)
З.Ы.Может компилятор не лицензионный biggrin.gif

Автор: bel_nikita 24.3.2004, 14:19
Сходи на http://www.firststeps.ru
Там есть пример про Англицкий и Русский меню.

PS: Ну, если это то, что тебе надоsmile.gif

Автор: DKeN 24.3.2004, 21:57
Coocky
submenu=pmenu->GetSubMenu(0) странно, такая запись обычно юзается когда используется всплывающее (Popup Menu) меню.

и еще запиши так:

submenu.LoadMenu(ID_MENU);
pmenu=submenu.GetSubMenu(0);
тогда ошибки не будет:-)

Автор: Coocky 24.3.2004, 22:30
Цитата
submenu=pmenu->GetSubMenu(0) странно, такая запись обычно юзается когда используется всплывающее (Popup Menu) меню.
Все правильно,друзья,меню всплывающее,но оно уже присоеденено к окну в AppWizard
Я уже и отсоединял и присоединял меню и загружал и что только не делал,но в процессе выполнения возникает ошибка.
Цитата
Там есть пример про Англицкий и Русский меню.

PS: Ну, если это то, что тебе надо

Подменяю меню я без проблем ,у меня задание перевести
Цитата
submenu.LoadMenu(ID_MENU);
pmenu=submenu.GetSubMenu(0);
тогда ошибки не будет:-)

Да, кстати,так я делал-ошибки нет,но Modify не работает(надо ж перевод сделать,вставить русский текст)
Че то я запутался...
У меня есть меню
Код
                Еnglish menu

            Save->             пункт1
                               пункт2
                               пункт3


            Save As->        пункт10
                               пункт20
                               пункт30


           Close->             пункт100
                               пункт200
                               пункт300

Все чисто схематично.Вот и нужно перевести все от Еnglish menu до пункт300

Автор: DKeN 24.3.2004, 23:18
так погодь у тя должно быть либо 2 меню на разных языках, либо по второму пути, заменить текст менюшек.

Если проект в VC, то могу обяснить как это делается, так как делал подобное в своих прогах.

Либо я чтото не допонял:-(

Автор: Coocky 24.3.2004, 23:23
У меня есть меню на аглицком,написаное по шаблону и присоедененое с помощью ресурсов к окну.Есть кнопка,при нажатии на которую происходит замена(превод меню) на русский,просто ,другими словами его модификация.(Я меняю строки заранее подготовлеными на русском)

Автор: Coocky 25.3.2004, 17:14
Цитата
pmenu=submenu.GetSubMenu(0);

И все же-почему не видет VS мои POP_Menu-они же есть

Автор: DKeN 25.3.2004, 18:44
итак приведу пример моих функций, может кому полезно будет:
Тут свои классы подобные MFC + WinAPI
Функция перебирает элементы меню + подменю, и вызывает для каждого элемента функцию изменяющую строку меню на новую.
Цитата

void UpdateMenuLanguage(Window *wnd,char *namelng,UINT nID_START,BOOL bCreate)
{
if(wnd==NULL) return;

File lng;
lng.SetFile(NAMEFILELNG);

HMENU hMenu=GetMenu(wnd->GetHWND()); //для главного меню, можно подставить хендл своего меню
int count=GetMenuItemCount(hMenu);

for(int i=0;i<count;i++) //main
{
  ModifyMenuLanguage(hMenu,i,nID_START,lng,namelng,bCreate);

  HMENU hSub=GetSubMenu(hMenu,i);
  if(hSub)
  {
  int countsub=GetMenuItemCount(hSub);//проверяем естьли элементы у подменю
 
  for(int j=0;j<countsub;j++) //main
  {
    ModifyMenuLanguage(hSub,j,nID_START+count,lng,namelng,bCreate);

    HMENU hSub2=GetSubMenu(hSub,j);
    if(hSub2)
    {
    int countsub2=GetMenuItemCount(hSub2);
 
    for(int j2=0;j2<countsub2;j2++) //main
    {
      ModifyMenuLanguage(hSub2,j2,nID_START+countsub+count,lng,namelng,bCreate);
    }

    }
  }
  }
}

if(bCreate==FALSE)
  DrawMenuBar(wnd->GetHWND());
}

Функция модификации меню, загружает строку из ини-файла и меняет ее у меню.
Цитата

void ModifyMenuLanguage(HMENU hMenu,int i,UINT nID_START,File &lng,char *namelng,BOOL bCreate)
{
  int nID=GetMenuItemID(hMenu,i);
 
  if(nID > 0)
  {
  if(bCreate)
  {
    char text[MAX_PATH];
    GetMenuString(hMenu,nID,text,sizeof(text),MF_BYCOMMAND);

    if(text[0])
    lng.WriteResID(namelng,nID,text);
  }
  else
  {
    char *ch=lng.ReadResID(namelng,nID);
    resItems.AddItem(nID,ch);
   
    if(ch[0])
    ModifyMenu(hMenu,nID,MF_BYCOMMAND|MF_STRING,nID,ch);
  }
  }
  else
  {
  if(bCreate)
  {
    char text[MAX_PATH];
    GetMenuString(hMenu,i,text,sizeof(text),MF_BYPOSITION);

    if(text[0])
    lng.WriteResID(namelng,nID_START+i,text);
  }
  else
  {
    char *ch=lng.ReadResID(namelng,nID_START+i);
    resItems.AddItem(nID_START+i,ch);

    if(ch[0])
    ModifyMenu(hMenu,i,MF_BYPOSITION|MF_STRING,0,ch);
  }

  }
}

Добавлено @ 18:48
Coocky
приведи полее полный код! кусочки так чтобы представлять полную картину.

Автор: Coocky 27.3.2004, 21:58
Вроде бы все хорошо и понятно,только вот не не удобно мне через HMENU работать... sad.gif
Да и некоторе функции непонятны
Код
lng.WriteResID(namelng,nID,text);

или
Код
lng.ReadResID(namelng,nID);

Понял что запись/чтение,а вот чего....
Вообще-то немного громоздко получилось,но работает.
И еще:
Код
resItems
Что это за обьект?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)