BOOL CProgressBar::Resize() { if (!IsWindow(GetSafeHwnd())) return FALSE; CStatusBar *pStatusBar = GetStatusBar(); if (!pStatusBar) return FALSE; // Redraw the window text if (IsWindowVisible()) { pStatusBar->SetPaneText(m_nPane, m_strMessage); pStatusBar->UpdateWindow(); } // Calculate how much space the text takes up CClientDC dc(pStatusBar); CFont *pOldFont = dc.SelectObject(pStatusBar->GetFont()); CSize size = dc.GetTextExtent(m_strMessage); // Length of text int margin = dc.GetTextExtent(_T(" ")).cx * 2; // Text margin dc.SelectObject(pOldFont); // Now calculate the rectangle in which we will draw the progress bar CRect rc; pStatusBar->GetItemRect(m_nPane, rc); // Position left of progress bar after text and right of progress bar // to requested percentage of status bar pane if (!m_strMessage.IsEmpty()) rc.left += (size.cx + 2*margin); rc.right -= (rc.right - rc.left) * (100 - m_nSize) / 100; if (rc.right < rc.left) rc.right = rc.left; // Leave a litle vertical margin (10%) between the top and bottom of the bar int Height = rc.bottom - rc.top; rc.bottom -= Height/10; rc.top += Height/10; // If the window size has changed, resize the window if (rc != m_Rect) { MoveWindow(&rc); m_Rect = rc; } return TRUE; }
void CProgressBar::Clear() { if (!IsWindow(GetSafeHwnd())) return; // Hide the window. This is necessary so that a cleared // window is not redrawn if "Resize" is called ModifyStyle(WS_VISIBLE, 0); CString str; if (m_nPane == 0) str.LoadString(AFX_IDS_IDLEMESSAGE); // Get the IDLE_MESSAGE else str = m_strPrevText; // Restore previous text // Place the IDLE_MESSAGE in the status bar CStatusBar *pStatusBar = GetStatusBar(); if (pStatusBar) { pStatusBar->SetPaneText(m_nPane, str); pStatusBar->UpdateWindow(); } }