Не пятничный вопрос по MFC CDialog

Здача простая — нужно в определенный момент показать модальный диалог но немодально. Первое, что пришло в голову это снести его в отдельный тред а-ля:

[code:30kybxzz]

UINT NonModalDlg(LPVOID Param)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
return 0;
}

void CFTDIServDlg::OnAtoDisconnect()
{
.....
AfxBeginThread(NonModalDlg,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
}
[/code:30kybxzz]
Черта с два — все равно модально хоть и в отдельном треде. Какого фига?
Кто знает как это обойти?

Комментариев нет

  1. дык не надо вызывать DoModal() ;)

    ключевое слово [b:1b8iz1pj]ShowWindow()[/b:1b8iz1pj] (асинхронное создание окна, потом его надо не забыть убить по пойнтеру DestroyWindow() типа)

    [code:1b8iz1pj] NewDialog *dlg;
    dlg = new NewDialog;
    dlg->Create(IDR_MYDIALOG);
    dlg->ShowWindow(SW_SHOW);
    [/code:1b8iz1pj]

    http://www.google.com/search?q=cdialog+modalless

    (не помню, будет оно мессаджи нормально процессить или нет после этого, см. в статьях выше примеры)

  2. [quote="Ghost":2a5pm3qo]дык не надо вызывать DoModal() ;)

    ключевое слово [b:2a5pm3qo]ShowWindow()[/b:2a5pm3qo] (асинхронное создание окна, потом его надо не забыть убить по пойнтеру DestroyWindow() типа)

    [code:2a5pm3qo] NewDialog *dlg;
    dlg = new NewDialog;
    dlg->Create(IDR_MYDIALOG);
    dlg->ShowWindow(SW_SHOW);
    [/code:2a5pm3qo]

    http://www.google.com/search?q=cdialog+modalless

    (не помню, будет оно мессаджи нормально процессить или нет после этого, см. в статьях выше примеры)[/quote:2a5pm3qo]
    это я видел — оно у меня крашится таким образом, не понимаю почему.

  3. Добавлю еще чуток из хэлпа:[quote:1yylpne5]When you implement a modeless dialog box, always override the [b:1yylpne5]OnCancel[/b:1yylpne5] member function and call [b:1yylpne5]DestroyWindow[/b:1yylpne5] from within it. Don’t call the base class [b:1yylpne5]CDialog::OnCancel[/b:1yylpne5], because it calls [b:1yylpne5]EndDialog[/b:1yylpne5], which will make the dialog box invisible but will not destroy it. You should also override [b:1yylpne5]PostNcDestroy[/b:1yylpne5] for modeless dialog boxes in order to delete [b:1yylpne5]this[/b:1yylpne5], since modeless dialog boxes are usually allocated with [b:1yylpne5]new[/b:1yylpne5]. Modal dialog boxes are usually constructed on the frame and do not need [b:1yylpne5]PostNcDestroy[/b:1yylpne5] cleanup.[/quote:1yylpne5]

  4. Нашел… логично… надо создавать dlgAbout в хипе а не локально, ибо после выхода из функции обьект перестает существовать :) вроде пересатло крашится, хотя все равно непонятно почему крашилось. Мессаджи вроде процессятся нормально.

Ответить