• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Vc++6.0:mfc: немодальный диалог

  • Автор темы ezus
  • Дата начала
E

ezus

Точнее оно выводится, но только по окончанию активности процесса, т.е. перед переходом к ожиданию действий пользователя.

Наверняка какая-то чушь с моей стороны, но найти не могу.

Вроде все сделал:

class ZsUtWaitWin : public CDialog

.....
_cwin = new ZsUtWaitWin();
_cwin->Create(IDD_ZSUT_WAIT_WIN,NULL);
.....
_cwin->SetWindowPos( NULL, dltX, dltY, 0, 0, SWP_NOSIZE );
_cwin->ShowWindow(SW_SHOW);

.....
BOOL ZsUtWaitWin::OnInitDialog()
{
CDialog::OnInitDialog();

m_anim.Open( "process.avi" );
m_mod = "";
m_obj = "";
m_oper = "";

UpdateData(FALSE);

return TRUE;
}


Может кто-нибуть что-нибуть увидит.

Спасибо.
 
E

European

Модальный диалог создается при помощи DoModal
 
D

Dimmuborgir

Код:
_cwin = new ZsUtWaitWin();
_cwin->Create(IDD_ZSUT_WAIT_WIN,NULL);
.....
_cwin->SetWindowPos( NULL, dltX, dltY, 0, 0, SWP_NOSIZE );
_cwin->ShowWindow(SW_SHOW);

это где происходит? поподробнее
 
E

ezus

Модальный диалог создается при помощи DoModal
В том и дело, что мне нужен НЕмодальный режим, чтобы параллельно с вычислениями показывать динамически промежуточные значения


Код:
_cwin = new ZsUtWaitWin();
_cwin->Create(IDD_ZSUT_WAIT_WIN,NULL);
.....
_cwin->SetWindowPos( NULL, dltX, dltY, 0, 0, SWP_NOSIZE );
_cwin->ShowWindow(SW_SHOW);

это где происходит? поподробнее

Есть два класса:

class ZsUtWaitWin : public CDialog - окно диалога
и
class ZsUtWait - интерфейсная оболочка к ZsUtWaitWin


ZsUtWait содержит
private:
ZsUtWaitWin* _cwin;


Функциональность:
/////////////////////////////
void ZsUtWait::init()
{
_cwin = new ZsUtWaitWin();
_cwin->Create(IDD_ZSUT_WAIT_WIN,NULL);

//// Posision
CRect rectW, rectD; ///,Rect2;

CRamcwApp *FApp = (CRamcwApp *) AfxGetApp();
CMainFrame *FMFrame = (CMainFrame *) FApp->m_pMainWnd;

FMFrame->GetWindowRect(&rectW);
_cwin->GetWindowRect(&rectD);

int dltX = rectW.Width()/2 - rectD.Width()/2;
int dltY = rectW.Height()/2 - rectD.Height()/2;

_cwin->SetWindowPos( NULL, dltX, dltY, 0, 0, SWP_NOSIZE );
//_cwin->ShowWindow(SW_NORMAL);
_cwin->ShowWindow(SW_SHOWNORMAL);

}

/////////////////////////////
BOOL ZsUtWaitWin::OnInitDialog()
{
CDialog::OnInitDialog();
// Add extra initialization here

m_anim.Open( "process.avi" ); // CAnimateCtrl m_anim;

m_mod = ""; // CString m_mod;
m_obj = ""; // CString m_obj;
m_oper = ""; // CString m_oper;

UpdateData(FALSE);

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

/////////////////////////////
void ZsUtWaitWin::show( CString t2, CString t3 )
{
m_obj = t2;
m_oper = t3;
UpdateData(FALSE);
ShowWindow(SW_SHOW);
}








Похоже я понял в чем дело, но не знаю пока как с этим бороться.

Рисование самого фрейма происходит в основном потоке управления - поэтому я виже пустое окно.
А вывод элементов окна выполняется отдельным сообщением к новому окну, и это сообщение лежит в очереди сообщений в ожидании окончания обработки предыдущих, т.е. получается - до окончания расчетов.

Вопрос?
Как мне заставить систему обработать сообщения к диалоговому окну немедленно, а потом продолдить вычисления?
 
G

grigsoft

Ну вообщем-то можно вызвать нечто вроде
Код:
BOOL ProcessMsgs()
{
MSG msg;
CWinApp* pApp=AfxGetApp();
while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
{ 
if ( !pApp->PumpMessage( ) ) 
{ 
::PostQuitMessage(0); 
return FALSE; 
} 
} 
return TRUE;
}

Но правильней будет обратить свой взор на потоки.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!