2016-12-08 3 views
0

Я закодировал приложение на основе MFC CDialog. В нормальных условиях он запускается, отображая CDialog окно из InitInstance обработчика как таковые:Как перенести мое вторичное диалоговое окно вверху при запуске приложения на основе CDialog?

CMyDialog dlg; 
INT_PTR nResponse = dlg.DoModal(); 

Но в первый раз это приложение работает, мне нужно, чтобы отобразить другой диалог изнутри CMyDialog::OnInitDialog до основного диалогового окна на экране , Так что я сделать подобную вещь:

CIntroDialog idlg(this); 
idlg.DoModal(); 

Но проблема с этим подходом является то, что мой второй CIntroDialog не отображается на переднем плане. Таким образом, я попытался исправить это, вызывая следующие внутри CIntroDialog::OnInitDialog:

this->SetForegroundWindow(); 
    this->BringWindowToTop(); 

, но это ничего не делать.

Я тогда попытался позвонить ::AllowSetForegroundWindow(ASFW_ANY); из InitInstance для приложения, и это тоже ничего не делало.

Любая идея, как принести это второе диалоговое окно на передний план при запуске приложения?

PS. Из-за структуры этого приложения мне нужно позвонить CIntroDialog::DoModal с CMyDialog::OnInitDialog, чтобы предотвратить обширный переписывание.

+0

Не уверен, но вызов 'CIntroDialog :: DoModal' из функции OnInitDialog может быть плохой идеей. –

+1

Удивительно, небольшой тест здесь делает, что отлично работает. Я бы попытался увидеть, если код комментирования в любом из них или в обоих случаях «OnInitDialog's» имеет эффект. Если вы не поправитесь, вы можете установить таймер в 'CMyDialog :: OnInitDialog', чтобы уйти через полсекунды или что-то еще, а в обработчике таймера вызывается' CIntroDialog'. – acraig5075

+0

Вам требуется какое-либо взаимодействие с пользователем в диалоговом окне Intro или просто для отображения информации? – rrirower

ответ

3

Считаете ли вы, что для этого в классе приложений используется InitInstance?

BOOL CMyApp::InitInstance() 
{ 
    AfxEnableControlContainer(); 

    // Standard initialization 
    // If you are not using these features and wish to reduce the size 
    // of your final executable, you should remove from the following 
    // the specific initialization routines you do not need. 

    CMyDlg dlg; 
    m_pMainWnd = &dlg; 
    INT_PTR nResponse = dlg.DoModal(); 
    if (nResponse == IDOK) 
    { 
     // TODO: Place code here to handle when the dialog is 
     // dismissed with OK 
    } 
    else if (nResponse == IDCANCEL) 
    { 
     // TODO: Place code here to handle when the dialog is 
     // dismissed with Cancel 
    } 

    // Since the dialog has been closed, return FALSE so that we exit the 
    // application, rather than start the application's message pump. 
    return FALSE; 
} 

я сократил некоторые реализации по умолчанию, но вы видите этот бит:

CMyDlg dlg; 
m_pMainWnd = &dlg; 
INT_PTR nResponse = dlg.DoModal(); 
if (nResponse == IDOK) 
{ 
    // TODO: Place code here to handle when the dialog is 
    // dismissed with OK 
} 
else if (nResponse == IDCANCEL) 
{ 
    // TODO: Place code here to handle when the dialog is 
    // dismissed with Cancel 
} 

Там ничто не мешает вам делать что-то вроде:

CMyDlg2 dlg2; 

if(dlg2.DoModal() == IDOK) 
{ 
    CMyDlg dlg; 
    m_pMainWnd = &dlg; 
    INT_PTR nResponse = dlg.DoModal(); 
    if (nResponse == IDOK) 
    { 
     // TODO: Place code here to handle when the dialog is 
     // dismissed with OK 
    } 
    else if (nResponse == IDCANCEL) 
    { 
     // TODO: Place code here to handle when the dialog is 
     // dismissed with Cancel 
    } 
} 
else 
{ 
    // Handle IDCANCEL 
} 

Я признаю, что я не тестировал вышеуказанный код, но я не понимаю, почему вы не можете выполнить первый диалог, а затем второй диалог.

+0

Как я уже упоминал выше: _ «Из-за структуры этого приложения мне нужно вызвать CIntroDialog :: DoModal из CMyDialog :: OnInitDialog, чтобы предотвратить обширный переписывание». _ – c00000fd

 Смежные вопросы

  • Нет связанных вопросов^_^