Уважаемые эксперты! Подскажите, что я делаю не так и как надо делать при смене главного меню окна. Я имею дав меню в ресурсах: для английского и для русского языка. По умолчанию меню на английском у меня указано в WNDCLASSEX (mov wc.lpszMenuName,IDR_MENU) и создается в CreateWindowEx. Потом мне его надо сменить, я делаю это в процедуре: Код (Text): SwitchMenus proc hWnd:DWORD,dLng:DWORD LOCAL hMenuOld invoke GetMenu,hWnd mov hMenuOld,eax .if dLng==1 ;English invoke LoadMenu,hInstance,lpszMenuEng .elseif dLng==2 ;Russian invoke LoadMenu,hInstance,lpszMenuRus .endif invoke SetMenu,hWnd,eax invoke DestroyMenu,hMenuOld ret SwitchMenus endp При этом происходит следущее: окно становится невидимым, остаются видны лишь контролы на нём.. Возможно после смены меню окно не перерисовывается (WM_PAINT не обрабатываю, а как это сделать?). А из-за чего, в чём дело?
на всякий случай: xor eax,eax в конце оконной процедуры есть? если она не обработала сообщение, то должна вернуть 0 системе. если в еах случайное число: возможно непредсказуемое поведение примерно так как ты описываешь.
2 shoo: Это имеется, вообще прога в целом работает, только на вызове SetMenu происходит бяка... Код (Text): ... .endif xor eax,eax ret WndProc endp end start Может стоило иначе ставить свой вопрос: как имея меню, загруженное способом как у меня заменить на другое меню из ресурсов. И желательно одним махом, а не поэлементно..
1.поставь бряк в этой функции и посмотри в отладчике, что тебе возвращает LoadMenu - может, ноль. 2.функция не проверяет, загрузилось ли меню: в любом случае меню заменяется на новое, даже если в еах - 0. сделай хотя бы так: Код (Text): test eax,eax jz @F invoke SetMenu,hWnd,eax invoke DestroyMenu,hMenuOld @@: ret
Попробуй не указывать меню при регистрации класса окна, а вызвать SwitchMenus при обработке WM_CREATE.
В одном случае это идентификатор (mov wc.lpszMenuName,IDR_MENU), во всех остальных случаях меню вызывается строкой (lpszMenuEng db "IDR_MENU",0\ invoke LoadMenu,hInstance,lpszMenuEng). Пробовал в WM_CREATE вызывать SwitchMenus, как советует rmn, но эффект тот же - от окна видны одни контролы. Советом shoo ещё не успел воспользоваться...
Yes!!! Спасибо всем участвовавшим, особая благодарность AsmGuru62, ведь именно он нашел мою ошибку! Я заменил строку на идентификатор в LoadMenu и всё стало как надо! Вот мой код теперь... Код (Text): .const ... IDR_MENU equ 32000 IDR_MENU_R equ 32001 ... .code ... SwitchMenus proc hWnd:DWORD,dLng:DWORD LOCAL hMenuOld invoke GetMenu,hWnd mov hMenuOld,eax .if dLng==1 ;English invoke LoadMenu,hInstance,IDR_MENU .elseif dLng==2 ;Russian invoke LoadMenu,hInstance,IDR_MENU_R .endif invoke SetMenu,hWnd,eax invoke DestroyMenu,hMenuOld invoke SetMenuAttr,hWnd ret SwitchMenus endp
Думаю, твоя ошибка тут: invoke LoadMenu,hInstance,lpszMenuEng нужно invoke LoadMenu,hInstance,addr lpszMenuEng
cresta, да вероятно и так, как ты говоришь заработало бы, не проверял. скорее да. я сослался на ресурс по идентификатору и стало работать как надо. тут то, для чего это было надо: http://mc-black.narod.ru/ (ссылка на откомпилированную программку).
Posle SetMenu poprobui vizvat: invoke DrawMenuBar, hWin Proverai hendli menu: invoke IsMenu, h_Menu. -------------------------------- Vozmojno menu iz resursov ne zagrujaetsa, a tekuhee ti udalaeh.
Всё у меня теперь работает.. Исходники по пожеланию kero в аттачменте. Всем спасибо за внимание! _1890070917__x3mEd015.zip