информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяSpanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Просто если главное окно _уже_ было задано, то обработка его... 23.10.07 00:12  Число просмотров: 2917
Автор: 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 завершается и все приложение, а качестве его очереди сообщений используется диалоговая.

> > и сходить дебаггером внутрь, то во внутренностях
> Пытался с этим разобраться, но пока совершенно ситуация для
> меня никак не проясняется.
<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
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach