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 CGraphWinkasatModalno(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.
Кто-нибудь может помочь разобраться, в чем дело?
пока пользователь его не закроет (т.е. программа создает экземпляр этого класса, вызывает метод 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 CGraphWinkasatModalno(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.
Кто-нибудь может помочь разобраться, в чем дело?