Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > не открывается окошко.


Автор: bilbobagginz 17.1.2007, 04:06
Здравствуйте.
есть приложение MFC, приложение - диалоговое, т.е. 
CWinApp имеет переменную порожденную от типа CDialog
после создания данной переменной, происходит вызов:
Код

    MyDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();

проект собирается, без проблем, но окно не открывается.
реализован метод OnInitDialog(). я поставил брейк-пойнт внутри нее, но контроль не доходит до этой функции. После конструктора программа выходит до CWinApp, и вызывает DoModal().

на что посмотреть, чтобы окно открывалось ?


Автор: zkv 17.1.2007, 05:37
а приложение мастером собиралось? Что то не могу представить что такое может быть, разве только что невидимый создается. 
Цитата(bilbobagginz @  17.1.2007,  04:06 Найти цитируемый пост)
После конструктора программа выходит до CWinApp, и вызывает DoModal().
 Так это все по плану, а DoModal() уже каким то боком должен вызвать OnInitDialog()

а что возвращает DoModal()?
и прога как себя ведет, запускается и сразу завершается, или виснет, или что? smile

Автор: bilbobagginz 17.1.2007, 05:57
DoModal() возвращает -1

Автор: hamsterKSU 17.1.2007, 17:57
код класса MyDlg.cpp покажи всетаки

Автор: zkv 17.1.2007, 18:13
Цитата(hamsterKSU @  17.1.2007,  17:57 Найти цитируемый пост)
код класса MyDlg.cpp покажи всетаки 

думаю ни о чем не скажет, интуиция подсказывает, что проблемы с ресурсами. Надо весь проект. Или создать новый и в нем воссоздать ошибку (на этом этапе проблема вероятно решится сама собой smile )

Автор: En_t_end 17.1.2007, 19:23
bilbobagginz, 
InitCommonControls(); вызови её перед открытием диалога. ИМХО

Автор: bilbobagginz 17.1.2007, 20:32
в основном приложении ( порожденное от CWinApp )
вызывается:

Код

BOOL MyApp::InitInstance(){
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);
    CWinApp::InitInstance();
    // потом создаётся мой диалог:
    MyDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();
// и потом обрабатывается результат,
// т.е. это единственное место, до которого я дотронулся в этом методе:
    switch (nResponse){
        case IDOK:
        // TODO: Place code here to handle when the dialog is
        //  dismissed with OK
        break;
        case IDCANCEL:
        // TODO: Place code here to handle when the dialog is
            //  dismissed with Cancel
        break;
        default:
            return FALSE;
    }
    return FALSE;
}

Автор: zkv 17.1.2007, 22:56
могу только посоветовать по шагам пройти по внутренностям DoModal() (Step Into) посмотреть что там происходит, особенно с ресурсами smile

Автор: bilbobagginz 17.1.2007, 23:08
Цитата

могу только посоветовать по шагам пройти по внутренностям DoModal() (Step Into) посмотреть что там происходит

сделал, но я не знаю что ДОЛЖНО быть, когда всё работает правильно.
на что именно смотреть ? можно поточнее ?


Автор: Earnest 18.1.2007, 11:14
Для начала должно успешно проходить стадию создания и входить в модальный цикл (вызывать RunModalLoop).
-1 возвращается либо если не найден шаблон:
Код

    // return -1 in case of failure to load the dialog template resource
    if (lpDialogTemplate == NULL)
        return -1;

либо если падает исключение:
Код

    CATCH_ALL(e)
    {
        DELETE_EXCEPTION(e);
        m_nModalResult = -1;
    }

Ну и, теоретически, хто-то может вызвать EndDialog(-1)...

Автор: bilbobagginz 20.1.2007, 14:06
Спасибо, я воспользовался знаниями zkv.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)