singlepost

Динамическое меню, MFC, SDI << На главную или назад  

Из-за чего в классе CView может не работать:

void CMenuView::OnMenuRestrict()
{
CMenu MyMenu;
MyMenu.DestroyMenu();
MyMenu.LoadMenu(IDR_MENU1);
SetMenu(&MyMenu);
}

?

Или как бы вы осуществили замену одного меню другим в процессе работы программы?

10 ответов в теме “Динамическое меню, MFC, SDI”

  1. 10
    Александр Чигринец ответил:

    Пожалуйста. :-)

  2. 9
    Мария Павлова ответил:

    Огромное спасибо за помощь! Оказывается, не хватало именно указателя..
    =)

  3. 8
    Александр Чигринец ответил:

    Во-первых, DEBUG ASSERTION можно посмотреть: что ему не нравится (войти в отладку).Иногда это поясняет ситуацию.

    Во-вторых и в примере МСДН и по приведённой ссылке SetMenu вызывается не у CView, а у главного окна. Можно воспользоваться функцией получения указателя на главное окно
    AfxGetMainWnd()->SetMenu(&m_menu);

  4. 7
    Мария Павлова ответил:

    Насчёт CMenu я поняла, что глупо так делать =) Исправила. Не помогло. В OnCreate всё работает.. И пример из MSDN, и из firststeps. А если писать в функции класса CView, то сначала ничего не происходит, а потом появляется Debug Assertion Failed =(

  5. 6
    Александр Чигринец ответил:

    То самое, что я написал: Объект СMenu нельзя объявлять в самой процедуре, потому что он удаляется, когда программа выходит из процедуры.
    Т.е. в приведённом в первом сообщении коде всё может работать правильно: грузиться, устанавливаться. Но потом меню удаляется и всё идёт на смарку.

  6. 5
    Мария Павлова ответил:

    Спасибо за MSDN
    А что можно про эту ссылку сказать:
    //www.firststeps.ru/mfc/steps/r.php?8 ?

  7. 4
    Александр Чигринец ответил:

    Во первых не нужно вызывать DestroyMeny для объекта, только что созданного объекта.
    Во вторых нужно иметь в виду, что myMenu прекращает своё существование в момент выхода из фнукции. А в диструкторе, наверняка, вызывается DestroyMenu.
    Я бы сделал myMenu полем класса, как это и предалается в примере по ссылке.

  8. 3
    Александр Чигринец ответил:

    Пример из MSDN
    //msdn.microsoft.com/en-us/library/177ay1×0(VS.80).aspx

  9. 2
    Денис Боенсков ответил:

    MyMenu.DestroyMenu(); => эта срока точно нужна?что она делает?

  10. 1
    Мария Павлова ответил:

    "Функция DestroyMenu() уничтожает меню. Как видите, эта она является членом класса CMenu. Мы уничтожаем не просто меню программы, а меню класса меню связанного с окном программы. Уничтожается меню связанное функцией SetMenu(). "

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.