Не вызывается обработчик Ondestroy!

Тема в разделе "MS Visual C++", создана пользователем michael_is_98, 15 окт 2005.

  1. michael_is_98

    michael_is_98 Member

    Регистрация:
    15 окт 2005
    Сообщения:
    14
    Симпатии:
    0
    Я создал класс на основе CframeWnd такой, который бы отображал окно до тех пор,
    пока пользователь его не закроет (т.е. программа создает экземпляр этого класса, вызывает метод PokasatModalno() - на этой точке открывается модальный фрейм, возврат из метода - по закрытии фрейма). Т.е. что-то наподобие ShowModal в Delphi.
    Вот исходный код

    code:--------------------------------------------------------------------------------
    class CGraphWin: public CFrameWnd
    {
    public:
    CGraphWin(CWnd *);
    void PokasatModalno();
    afx_msg void OnClose(void);
    afx_msg void OnPaint(void);
    afx_msg void OnSize( UINT, int, int);
    afx_msg void OnDestroy();
    afx_msg void OnCommand_Vihod();
    private:
    CWnd *pWnd; // родительское окно, к которому прикрепляется "модальный фрейм"
    ...
    }
    --------------------------------------------------------------------------------

    Вот конструктор

    code:--------------------------------------------------------------------------------
    CGraphWin::CGraphWin(CWnd *pWnd_=NULL):CFrameWnd()
    {
    pWnd=pWnd_;

    // создание окно фрейма с меню
    Create(NULL, "График", WS_OVERLAPPEDWINDOW, rectDefault, pWnd, "GRAPHMENU");
    }
    --------------------------------------------------------------------------------

    Теперь самое интересное - метод PokasatModalno и обработчик OnClose

    code:--------------------------------------------------------------------------------
    void CGraphWin:eek:kasatModalno(void)
    {
    pWnd->EnableWindow(FALSE);

    RunModalLoop(MLF_SHOWONIDLE); // ждет пока не будет вызван EndModalLoop

    BOOL b=pWnd->EnableWindow(TRUE);
    }

    afx_msg void CGraphWin::OnClose()
    {
    // завершить цикл обработки сообщений
    EndModalLoop(0);
    }

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

    Таким образом описав этот класс можно его использовать, предположим в главном окне приложения при обработке выбора пункта меню пишем:

    code:--------------------------------------------------------------------------------
    afx_msg void CMainWin::OnCommand_Risov()
    {
    CGraphWin *gw=new CGraphWin(this);
    gw->PokasatModalno();
    delete gw;

    }
    --------------------------------------------------------------------------------

    Все работает, окно CGraphWin отображается как модальный фрейм, его можно закрывать, снова открывать, но обработчик
    OnDestroy в CGraphWin не вызывается!

    После закрытия главного окна приложения в окне Output появляется предупреждение
    Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.

    Кто-нибудь может помочь разобраться, в чем дело?
     
  2. michael_is_98

    michael_is_98 Member

    Регистрация:
    15 окт 2005
    Сообщения:
    14
    Симпатии:
    0
    Специально для тестирования создал простенький проект. Предлагаю его испытать.
    Это простое WIn32 Application, только в свойствах проекта нужно поставить
    Use MFC in Static Library. Далее добавить в проект файлы - main.cpp, test.cpp, resource.rc
     

    Вложения:

    • test.zip
      Размер файла:
      2,9 КБ
      Просмотров:
      42
Загрузка...

Поделиться этой страницей