#c #visual-c #mfc
#c #visual-c #mfc
Вопрос:
Пытаюсь запустить простое приложение MFC, но закрывается, потому что программа завершается, предполагая, что мне нужно запустить диалоговое окно в отдельном потоке, но не могу понять, как это сделать.
Вот код до сих пор:
CWinApp theApp;
using namespace std;
int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(NULL);
theApp.InitApplication();
theApp.InitInstance();
theApp.Run();
AfxWinTerm();
if (hModule != NULL)
{
// initialize MFC and print and error on failure
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failedn"));
nRetCode = 1;
}
else
{
MyDialog *mdlg = new MyDialog();
mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
mdlg->ShowWindow( true );
}
}
else
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: GetModuleHandle failedn"));
nRetCode = 1;
}
return nRetCode;
}
Должно быть что-то простое, что я могу сделать, чтобы программа не завершалась, просто не уверен, как?
Ответ №1:
Вместо вызова:
mdlg->ShowWindow( true );
вы должны сделать:
mdlg->DoModal();
Кроме того, я не думаю, что вам нужно Create
. Если вы хотите остаться с немодальным диалогом, вам следует создать цикл сообщений перед возвратом из main — что-то вроде here http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows
Комментарии:
1. Смотрел на это, но мой класс (наследуется от CDialog) не имеет члена «DoModel»?
2. Если это MFC CDialog, то он, безусловно, имеет DoModal (по наследству): msdn.microsoft.com/pl-pl/library/619z63f5.aspx
3. Да, я был идиотом, я получаю ошибку утверждения отладки: // не удается вызвать DoModal в диалоговом окне, уже созданном как немодальное УТВЕРЖДЕНИЕ (m_hWnd == NULL);
4. Избавился от создания, но не удалось выполнить утверждение перекачки сообщения: TRACE(traceAppMsg, 0, «Ошибка: CWinThread::PumpMessage вызывается, когда не разрешено. n»); ASSERT(FALSE);
5. Наконец-то понял; использовал ссылку на Википедию и вызвал WinMain после выполнения Create() и ShowWindow();
Ответ №2:
Насколько я вижу, вы создали консольное приложение Win32 и пытаетесь добавить к нему графический интерфейс? Вы должны делать это только в том случае, если вам действительно нужна консоль. Если нет, то лучше создайте новый проект, выберите шаблон приложения MFC и выберите приложение на основе диалога. Мастер создаст все, что вам нужно.
Кстати, ваш
MyDialog *mdlg = new MyDialog();
mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
mdlg->ShowWindow( true );
лучше было бы:
MyDialog mdlg;
mdlg.DoModal();
new
В вашем случае нет необходимости, поэтому просто выделите объект в стеке. И DoModal
делает то, что вы хотите.
В моем консольном приложении Win32 с поддержкой MFC я смог показать диалоговое окно. Но в моем сгенерированном мастером коде этих строк не было, поэтому, возможно, вам следует их удалить:
theApp.InitApplication();
theApp.InitInstance();
theApp.Run();
AfxWinTerm();
Комментарии:
1. Да, это то, к чему я стремился, есть идеи, почему это может возникнуть: TRACE(traceAppMsg, 0, «Ошибка: CWinThread::PumpMessage вызывается, когда не разрешено. n»); ASSERT(FALSE); ?
2. @user3047190 Когда приходит это сообщение? Вы воссоздали проект или это все еще консольное приложение? Когда возникает ошибка?
3. Спасибо, решил это, используя вики-ссылку в принятом ответе, я знаю, что проблема была как-то связана с перекачкой сообщений, поэтому вики-ссылка позволила мне создать цикл сообщений для передачи сообщений между диалоговыми кнопками и программой — и, следовательно, программа оставалась открытой
4. @user3047190 Я обновил свой ответ. Нет необходимости создавать цикл сообщений!