Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
[MFC] Обломался с Hello World 21.10.07 00:04
Автор: Heller <Heller> Статус: Elderman
|
Только начал изучать MFC. VIsual C++ 6. Файл проекта в архиве: http://heller.ru/hrenvam/hello.7z. Ниже приведу сырц, если надо.
В общем компилируется и запускается все нормально, но в InitInstance написано после dlg.DoModal() показать еще и AfxMessageBox, чего не происходит. Не понимаю почему. Даже догадок не имею. Код полностью:
#include "afxwin.h"
#include "resource.h"
class CHelloApp : public CWinApp {
public:
virtual BOOL InitInstance();
};
CHelloApp app;
class CHelloDialog : public CDialog {
public:
CString m_Text;
CHelloDialog();
protected:
virtual void OnCancel();
virtual void OnOK();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnDefault();
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CHelloDialog, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnDefault)
END_MESSAGE_MAP()
BOOL CHelloApp::InitInstance()
{
CHelloDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
AfxMessageBox(dlg.m_Text);
return FALSE;
}
CHelloDialog::CHelloDialog() : CDialog(IDD_DIALOG1)
{
m_Text = "";
}
void CHelloDialog::OnDefault()
{
m_Text = "Hello World!";
UpdateData(FALSE);
MessageBeep(0);
}
void CHelloDialog::DoDataExchange(CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_Text);
}
void CHelloDialog::OnOK()
{
CDialog::OnOK();
MessageBeep(0);
}
void CHelloDialog::OnCancel()
{
MessageBeep(0);
CDialog::OnCancel();
}
---
|
|
главное окно уже закрылось 21.10.07 03:09
Автор: dl <Dmitry Leonov>
|
И похоже, что в очередь сообщений уже попало WM_QUIT, которое при дальнейшей обработке приводит к немедленному закрытию всех свежесозданных окон. По крайней мере, если воткнуть пониже
CHelloDialog dlg2;
dlg2.DoModal();
и сходить дебаггером внутрь, то во внутренностях CWnd::RunModalLoop оно доходит до этих пор и отваливается, сразу показав диалог:
// pump message, but quit on WM_QUIT
if (!AfxPumpMessage())
{
AfxPostQuitMessage(0);
return -1;
}
---
|
| |
Пока сложно для меня 22.10.07 23:37
Автор: Heller <Heller> Статус: Elderman
|
Я только начал MFC изучать, так что пока плохо соображаю, что к чему, но не понятно какое отношение в данном случае вообще переменная m_pMainWnd имеет к AfxMessageBox (допустим мы поменяем сообщение на простое "Hello World" без обращения к члену диалога). Если вообще не создавать никакого окна и сразу в InitInstance прописать AfxMessageBox то оно нормально сработает с нулевым m_pMainWnd.
> И похоже, что в очередь сообщений уже попало WM_QUIT, > которое при дальнейшей обработке приводит к немедленному > закрытию всех свежесозданных окон. По крайней мере, если > воткнуть пониже Насколько я это понимаю, для CHelloApp такое понятие как очередь сообщений появляется только после того, как InitInstance вернет значение TRUE - до этого момента никто извне никак на его работу повлиять не может. Ну а то что WM_QUIT посылается в диалог опять же непонятно каким образом прерывает выполнение InitInstance.
> и сходить дебаггером внутрь, то во внутренностях Пытался с этим разобраться, но пока совершенно ситуация для меня никак не проясняется.
|
| | |
Просто если главное окно _уже_ было задано, то обработка его... 23.10.07 00:12
Автор: dl <Dmitry Leonov>
|
> Я только начал MFC изучать, так что пока плохо соображаю, > что к чему, но не понятно какое отношение в данном случае > вообще переменная m_pMainWnd имеет к AfxMessageBox > (допустим мы поменяем сообщение на простое "Hello World" > без обращения к члену диалога). Если вообще не создавать > никакого окна и сразу в InitInstance прописать > AfxMessageBox то оно нормально сработает с нулевым > m_pMainWnd.
Просто если главное окноужебыло задано, то обработка его закрытия имеет особый смысл для приложения. И после этого функция GetMessage, которая вызывается при создании всех последующих окон искренне считает, что приложение находится на стадии завершения и возвращает ноль, что приводит к практически мгновенному закрытию всех в дальнейшем создаваемых окон. Кстати, если не инициализировать m_pMainWnd, то есть шанс что все заработает как ожидалось.
> > И похоже, что в очередь сообщений уже попало WM_QUIT, > > которое при дальнейшей обработке приводит к > немедленному > > закрытию всех свежесозданных окон. По крайней мере, > если > > воткнуть пониже > Насколько я это понимаю, для CHelloApp такое понятие как > очередь сообщений появляется только после того, как > InitInstance вернет значение TRUE - до этого момента никто > извне никак на его работу повлиять не может. Ну а то что > WM_QUIT посылается в диалог опять же непонятно каким > образом прерывает выполнение InitInstance.
Не совсем так. В случае приложения с главным окном-диалогом после завершения InitInstance завершается и все приложение, а качестве его очереди сообщений используется диалоговая.
> > и сходить дебаггером внутрь, то во внутренностях > Пытался с этим разобраться, но пока совершенно ситуация для > меня никак не проясняется.
|
| | | |
Теперь разобрался, спасибо! 23.10.07 03:02
Автор: Heller <Heller> Статус: Elderman
|
|
|
|