How to show progress control in Status bar pane
Uma Shankar -- Uma_Shankar@countrywide.com Tuesday, March 26, 1996 hi all, Can some one suggest me, on how to show progress bar on the status bar. I tried this way. Created a dialog with a progress bar control in it. Added the Resource id of the dialog to the indicators array in mainfrm.cpp Added onupdate command UI hander for this id.. Am i goofing? If so please let me know the way to do it thanks in advance shankar
Jim Leavitt -- jimll@halcyon.com Saturday, March 30, 1996 Uma Wrote.... ---------- Can some one suggest me, on how to show progress bar on the status bar. I tried this way. Created a dialog with a progress bar control in it. Added the Resource id of the dialog to the indicators array in mainfrm.cpp Added onupdate command UI hander for this id.. I Reply.... Uma: I've done this, my application is MDI, here's what I did: 1. Added to CMainFrame: a public CProgressCtrl pointer.... public: CProgressCtrl* m_pCtrlMainProgress; BOOL bProgressCreated; // flag is progress ctrl created? void CreateProgressCtrl(); // create the progress ctrl BOOL ShowProgressCtrl(BOOL bShow); // show it or hide it BOOL SetProgress(int nPercent); // set the progress thus far BOOL StepProgressCtrl(); // step it as necessary with these implementations... BOOL CMainFrame::ShowProgressCtrl(BOOL bShow) { if (bShow == TRUE) { if (bProgressCreated == FALSE) CreateProgressCtrl(); m_pCtrlMainProgress->ShowWindow(SW_SHOW); } else m_pCtrlMainProgress->ShowWindow(SW_HIDE); return TRUE; } BOOL CMainFrame::SetProgress(int nPercent) { if (bProgressCreated == FALSE) CreateProgressCtrl(); m_pCtrlMainProgress->SetPos(nPercent); return TRUE; } BOOL CMainFrame::StepProgressCtrl() { if (bProgressCreated == FALSE) CreateProgressCtrl(); m_pCtrlMainProgress->StepIt(); return TRUE; } void CMainFrame::CreateProgressCtrl() { m_pCtrlMainProgress = new CProgressCtrl(); CRect rProgressRect; m_wndStatusBar.SetPaneText(ID_SEPARATOR,""); m_wndStatusBar.GetItemRect(ID_SEPARATOR, &rProgressRect); rProgressRect.DeflateRect(1,1); // 1 pixel border... rProgressRect.right = 200; m_pCtrlMainProgress->Create(WS_CHILD, rProgressRect, &m_wndStatusBar, 4 ); m_pCtrlMainProgress->SetRange(0,100); m_pCtrlMainProgress->SetStep(10); m_pCtrlMainProgress->ShowWindow(SW_HIDE); bProgressCreated = TRUE; } Then later, when I need it, I call the below from an importing routine... CMainFrame* wndpMainWnd = ((CInspectorApp*) AfxGetApp())->m_pMainFrame; wndpMainWnd->SetProgress(0); wndpMainWnd->ShowProgressCtrl(TRUE); wndpMainWnd->UpdateWindow(); and step it with... wndpMainWnd->SetProgress(nProgress); where nProgress is an integer representing the progress thus far... Finally, when the app end, the CMainFrame destructor deletes it... CMainFrame::~CMainFrame() { if (bProgressCreated == TRUE) delete m_pCtrlMainProgress; } I'm not saying this is the best way to handle it, hope this helps! Jim Leavitt...
Niels Ull Jacobsen -- nuj@kruger.dk Monday, April 01, 1996 At 18:16 26-03-96, you wrote: >hi all, >Can some one suggest me, on how to show progress bar on the status bar. >I tried this way. >Created a dialog with a progress bar control in it. >Added the Resource id of the dialog to the indicators array in mainfrm.cpp >Added onupdate command UI hander for this id.. > >Am i goofing? If so please let me know the way to do it Basically, yes :-) I think the easiest way to do what you want is to draw the progress bar yourself, not using the standard control. Use m_StatusBar.GetStatusBarCtrl().SetText("", 2, SBT_OWNERDRAW); // assume progress control is in pane 2 Subclass m_StatusBar to handle WM_DRAWITEM. Draw the progress bar using two FillSolidRect's. >thanks in advance >shankar > > > Niels Ull Jacobsen, Krьger A/S (nuj@kruger.dk) Everything stated herein is THE OFFICIAL POLICY of the entire Kruger group and should be taken as legally binding in every respect. Pigs will grow wings and fly.
Frank McGeough -- frankhm@synchrologic.com Wednesday, April 03, 1996 Niels Ull Jacobsen wrote: > > At 18:16 26-03-96, you wrote: > >hi all, > >Can some one suggest me, on how to show progress bar on the status bar. > >I tried this way. > >Created a dialog with a progress bar control in it. > >Added the Resource id of the dialog to the indicators array in mainfrm.cpp > >Added onupdate command UI hander for this id.. > > > >Am i goofing? If so please let me know the way to do it > Basically, yes :-) > > I think the easiest way to do what you want is to draw the progress bar > yourself, > not using the standard control. > > Use m_StatusBar.GetStatusBarCtrl().SetText("", 2, SBT_OWNERDRAW); // assume > progress control is in pane 2 > > Subclass m_StatusBar to handle WM_DRAWITEM. Draw the progress bar using two > FillSolidRect's. I don't necessarily agree that drawing yourself is the easiest. I think they are both relatively easy (but drawing yourself works under Win 3.1). To put the progress control in the status bar, I would use a couple of indicator arrays (that arrays of ids declared in mainfrm.cpp in a appwizard created app). For example, UINT TheIndicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_TIME // clock }; UINT TheProgressIndicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_PROGRESS, // our progress bar ID_INDICATOR_TIME // clock }; Have a pointer to a CProgressCtrl member variable in your view or CMainFrame class. When you want to display the progress bar call something like the following routine. BOOL CSvsyncView::CreateProgressBar() { BOOL bSuccess = TRUE; RECT rect; CStatusBar* pStatusBar = 0; if (!m_pProgress) m_pProgress = new CProgressCtrl; // get the status bar from CFrameWnd pStatusBar = GetStatusBar(); ASSERT(pStatusBar); if (pStatusBar) { pStatusBar->SetIndicators(TheProgressIndicators, sizeof(TheProgressIndicators)/sizeof(UINT)); int nIndex = pStatusBar->CommandToIndex(ID_INDICATOR_PROGRESS); ASSERT(nIndex >= 0); // confine our progress control to the indicator area pStatusBar->GetItemRect( nIndex, &rect); rect.top += 1; rect.bottom -= 1; rect.left += 1; rect.right -= 1; m_pProgress->Create( WS_VISIBLE | WS_CHILD , rect, pStatusBar, IDC_PROGRESS_CONTROL); m_pProgress->SetStep(1); SetPaneText("Ready"); } return bSuccess; } When you are done showing progress simply flip the indicators back using the SetIndicators call and passing in 'TheIndicators'. __________________________________________________ Frank McGeough frankhm@synchrologic.com Synchrologic, Inc. (http://www.synchrologic.com/) Voice: 404.876.3209 Fax: 404.876.3809
| Вернуться в корень Архива |