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

ezus

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

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

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

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;
}


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

Спасибо.
 
D

Dimmuborgir

#3
Код:
_cwin = new ZsUtWaitWin();
_cwin->Create(IDD_ZSUT_WAIT_WIN,NULL);
.....
_cwin->SetWindowPos( NULL, dltX, dltY, 0, 0, SWP_NOSIZE );
_cwin->ShowWindow(SW_SHOW);
это где происходит? поподробнее
 

ezus

Member
30.10.2008
8
0
#4
Модальный диалог создается при помощи 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);
}








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

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

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

grigsoft

Well-known member
15.11.2005
735
0
#5
Ну вообщем-то можно вызвать нечто вроде
Код:
BOOL ProcessMsgs()
{
MSG msg;
CWinApp* pApp=AfxGetApp();
while ( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
{ 
if ( !pApp->PumpMessage( ) ) 
{ 
::PostQuitMessage(0); 
return FALSE; 
} 
} 
return TRUE;
}
Но правильней будет обратить свой взор на потоки.