Display Update Speed for Dialog Boxes
Environment: Visual C++ 6
I've been searching for a simple answer to a problem. I wanted to increase the display update rate for a dialog box. This (modeless) dialog includes a progress bar, and it displays a percentage number and another number indicating progress (initially in edit boxes). When I'd disable the display update functions (m_progress.SetPos() and dlg->UpdateData(FALSE), the function generating these numbers would complete in half the time. I tried using a DC and the TextOut() function (rather than updating the edit boxes), but that didn't speed things up either. Until I looked at the myriad of windows messages sent when I used UpdateData(FALSE) I didn't realize the origin of the wasted time. It's all due to the "repainting" of the main app window (frame). Since I'm (relatively) inexperienced with MFC, I'm delighted to find such a simple solution. When you display the dialog box hide the main window (if you don't require it's use at that time). I don't use the UpdateData(FALSE) function, but I still see the information on the screen, and the progress bar updates as expected (in a negligible amount of time). I'm sure some of you may see holes in my theory, but this works fine for my app.
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CWnd* temp_main_wnd = AfxGetMainWnd();
temp_main_wnd->ShowWindow(SW_HIDE);
}
void CMyOperation::GetDataAndDisplay()
{
unsigned int m_percent = 0;
unsigned int m_other_data = 0;
int x = 200;
int y = 200;
CMyDialog* dlg;
CDC* TempDC = NULL;
CDC LocalDC;
dlg = new CMyDialog;
dlg->Create(IDD_MY_DIALOG, NULL);
dlg->ShowWindow(SW_SHOWNORMAL);
TempDC = dlg->GetDC();
LocalDC.m_hAttribDC = TempDC->m_hAttribDC;
LocalDC.m_hDC = TempDC->m_hDC;
...
...
// When it's time to update the display...
dlg->m_progress.SetPos(m_percent);
LocalDC.TextOut(x, y, m_percent);
LocalDC.TextOut(x, y + 50, m_other_data);
...
...
}
void CMyDialog::OnCancel()
{
CWnd* temp_main_wnd = AfxGetMainWnd();
temp_main_wnd->ShowWindow(SW_SHOW);
CDialog::OnCancel();
}

Comments
Solution from Jeff Prosise
Posted by Legacy on 02/02/2004 12:00amOriginally posted by: Anatoly Smelkov
Take at look at the MSJ article of Feb., 1997:
Replyhttp://www.microsoft.com/msj/0297/wicked/wicked0297.aspx
reducing flicker/speeding update
Posted by Legacy on 01/08/2002 12:00amOriginally posted by: paul marston
Try setting the properties to clip child/sibling!
even easier!!!
ReplyAnother approach
Posted by Legacy on 08/08/2001 12:00amOriginally posted by: Yurikus
ReplyVery simple way to update window/dialog display
Posted by Legacy on 10/25/2000 12:00amOriginally posted by: Hakan Erdun
You can use UpdateWindow( ); No need anything else.
/*
CWindow::UpdateWindow
This method updates the client area.
Syntax:
BOOL UpdateWindow( );
*/
Reply