Смена меню

Тема в разделе "WASM.WIN32", создана пользователем mc black, 25 ноя 2005.

  1. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Уважаемые эксперты! Подскажите, что я делаю не так и как надо делать при смене главного меню окна. Я имею дав меню в ресурсах: для английского и для русского языка. По умолчанию меню на английском у меня указано в WNDCLASSEX (mov wc.lpszMenuName,IDR_MENU) и создается в CreateWindowEx. Потом мне его надо сменить, я делаю это в процедуре:


    Код (Text):
    1. SwitchMenus proc hWnd:DWORD,dLng:DWORD
    2.     LOCAL hMenuOld
    3.     invoke GetMenu,hWnd
    4.     mov hMenuOld,eax
    5.     .if dLng==1
    6.         ;English
    7.         invoke LoadMenu,hInstance,lpszMenuEng
    8.     .elseif dLng==2
    9.         ;Russian
    10.         invoke LoadMenu,hInstance,lpszMenuRus
    11.     .endif
    12.     invoke SetMenu,hWnd,eax
    13.     invoke DestroyMenu,hMenuOld
    14.     ret
    15. SwitchMenus endp




    При этом происходит следущее: окно становится невидимым, остаются видны лишь контролы на нём.. Возможно после смены меню окно не перерисовывается (WM_PAINT не обрабатываю, а как это сделать?). А из-за чего, в чём дело?
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    на всякий случай: xor eax,eax в конце оконной процедуры есть? если она не обработала сообщение, то должна вернуть 0 системе. если в еах случайное число: возможно непредсказуемое поведение примерно так как ты описываешь.
     
  3. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    2 shoo: Это имеется, вообще прога в целом работает, только на вызове SetMenu происходит бяка...
    Код (Text):
    1.  
    2.     ...
    3.     .endif
    4.     xor eax,eax
    5.     ret
    6. WndProc endp
    7. end start


    Может стоило иначе ставить свой вопрос: как имея меню, загруженное способом как у меня заменить на другое меню из ресурсов. И желательно одним махом, а не поэлементно..
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    1.поставь бряк в этой функции и посмотри в отладчике, что тебе возвращает LoadMenu - может, ноль.

    2.функция не проверяет, загрузилось ли меню: в любом случае меню заменяется на новое, даже если в еах - 0.

    сделай хотя бы так:
    Код (Text):
    1.     test eax,eax
    2.     jz @F
    3.     invoke SetMenu,hWnd,eax
    4.     invoke DestroyMenu,hMenuOld
    5. @@:
    6.     ret
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Попробуй не указывать меню при регистрации класса окна, а вызвать SwitchMenus при обработке WM_CREATE.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    А меню ресурс как назван?

    Это строка или идентификатор?
     
  7. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    В одном случае это идентификатор (mov wc.lpszMenuName,IDR_MENU), во всех остальных случаях меню вызывается строкой (lpszMenuEng db "IDR_MENU",0\ invoke LoadMenu,hInstance,lpszMenuEng).



    Пробовал в WM_CREATE вызывать SwitchMenus, как советует rmn, но эффект тот же - от окна видны одни контролы.



    Советом shoo

    ещё не успел воспользоваться...
     
  8. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Yes!!! Спасибо всем участвовавшим, особая благодарность AsmGuru62, ведь именно он нашел мою ошибку! Я заменил строку на идентификатор в LoadMenu и всё стало как надо! Вот мой код теперь...
    Код (Text):
    1. .const
    2.     ...
    3.     IDR_MENU equ 32000
    4.     IDR_MENU_R equ 32001
    5.     ...
    6. .code
    7.     ...
    8. SwitchMenus proc hWnd:DWORD,dLng:DWORD
    9.     LOCAL hMenuOld
    10.     invoke GetMenu,hWnd
    11.     mov hMenuOld,eax
    12.     .if dLng==1
    13.         ;English
    14.         invoke LoadMenu,hInstance,IDR_MENU
    15.     .elseif dLng==2
    16.         ;Russian
    17.         invoke LoadMenu,hInstance,IDR_MENU_R
    18.     .endif
    19.     invoke SetMenu,hWnd,eax
    20.     invoke DestroyMenu,hMenuOld
    21.     invoke SetMenuAttr,hWnd
    22.     ret
    23. SwitchMenus endp
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Думаю, твоя ошибка тут:

    invoke LoadMenu,hInstance,lpszMenuEng

    нужно

    invoke LoadMenu,hInstance,addr lpszMenuEng
     
  10. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    cresta, да вероятно и так, как ты говоришь заработало бы, не проверял. скорее да. я сослался на ресурс по идентификатору и стало работать как надо. тут то, для чего это было надо: http://mc-black.narod.ru/ (ссылка на откомпилированную программку).
     
  11. Chib777

    Chib777 Александр

    Публикаций:
    0
    Регистрация:
    22 сен 2003
    Сообщения:
    82
    Адрес:
    Ukraine, Odessa
    Posle SetMenu poprobui vizvat:

    invoke DrawMenuBar, hWin

    Proverai hendli menu:

    invoke IsMenu, h_Menu.

    --------------------------------

    Vozmojno menu iz resursov ne zagrujaetsa, a tekuhee ti udalaeh.
     
  12. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Всё у меня теперь работает.. Исходники по пожеланию kero в аттачменте. Всем спасибо за внимание!



    [​IMG] _1890070917__x3mEd015.zip