• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы michael_is_98
  • Дата начала
M

michael_is_98

Я создал класс на основе 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.

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

michael_is_98

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

Вложения

  • test.zip
    2,9 КБ · Просмотры: 171
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!