From: Ajay Kalra on 29 Mar 2010 14:43 On Mar 27, 3:58 pm, Hector Santos <sant9...(a)nospam.gmail.com> wrote: > I would like to simplify this by getting the specific CStatusBar pane > window handle so I can take control of the attributes. I dont think each status bar pane is a window by itself (unless you put one there). You can confirm it by using Spy++. -- Ajay
From: Hector Santos on 29 Mar 2010 15:41 Ajay Kalra wrote: > On Mar 27, 3:58 pm, Hector Santos <sant9...(a)nospam.gmail.com> wrote: >> I would like to simplify this by getting the specific CStatusBar pane >> window handle so I can take control of the attributes. > > I dont think each status bar pane is a window by itself (unless you > put one there). You can confirm it by using Spy++. Yes, I finally noticed this using Spy++. I am now using the CExtStatusBarControl at codeproject. I had to make corrections to it to override the CStatusBar::SetPaneText() so that the index is checked against the custom controls managed by the sub-class or default to the base class. Thanks -- HLS
From: Hector Santos on 29 Mar 2010 16:42 Hector Santos wrote: > Ajay Kalra wrote: > >> On Mar 27, 3:58 pm, Hector Santos <sant9...(a)nospam.gmail.com> wrote: >>> I would like to simplify this by getting the specific CStatusBar pane >>> window handle so I can take control of the attributes. >> >> I dont think each status bar pane is a window by itself (unless you >> put one there). You can confirm it by using Spy++. > > Yes, I finally noticed this using Spy++. > > I am now using the CExtStatusBarControl at codeproject. I had to make > corrections to it to override the CStatusBar::SetPaneText() so that the > index is checked against the custom controls managed by the sub-class or > default to the base class. > > Thanks For the newsgroups search archives, just in case future people come across a similar need, the cool CStatusBar subclass at codeproject: http://www.codeproject.com/KB/statusbar/ExtStatusControlBar.aspx which allows you to add controls to the status bar, it did not have the logic to update the text pane (i.e, online timer) with the inherited base function: BOOL SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = 1); The subclass keeps/manages a different array for the controls vs the pane indicators. This SetPaneText wrapper added to the subclaas resolves it: BOOL CExtStatusControlBar::SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate) { if( nIndex < m_nCount && nIndex >= 0 ){ _STATUSBAR_PANE_ pane; if (PaneInfoGet(nIndex, &pane)) { for ( int i = 0; i < m_arrPaneControls.GetSize(); i++ ){ if (m_arrPaneControls[i]->nID == pane.nID) { _STATUSBAR_PANE_CTRL_ *pPaneCtrl = m_arrPaneControls[i]; if( pPaneCtrl ) { ::SetWindowText(pPaneCtrl->hWnd,lpszNewText); return TRUE; } return FALSE; } } return CStatusBar::SetPaneText( nIndex, lpszNewText, bUpdate); } } return FALSE; } Here is an implementation example: After normally adding your CStatusBar control to your MFC main frame, change the member to: CExtStatusControlBar m_wndStatusBar; And in the CMainFrame::OnCreate(CREATESTRUCT *cs), create a CStatic control or any other control. int CMainFrame::OnCreate(CREATESTRUCT *cs) { if (CFrameWnd::OnCreate(cs) == -1) { return -1; } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // // create a right aligned static control and // add to the end of status bar as the pane. // const char *pText = "Wildcat!"; CStatic *m_pWndLabel = new CStatic; UINT nPosition = m_wndStatusBar.GetCount(); if (!m_pWndLabel->Create(_T("Wildcat!"), WS_CHILD|WS_VISIBLE|WS_TABSTOP|SS_RIGHT, CRect(0,0,0,0), &m_wndStatusBar)) { TRACE("Failed to create label control.\n"); return -1; } m_pWndLabel->SetFont(CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT))); UINT nLabelId = m_pWndLabel->GetDlgCtrlID(); if(!m_wndStatusBar.AddPane(nLabelId,nPosition)) { AfxMessageBox(_T("out of range or duplicate id"), MB_ICONERROR); return -1; } int nIndex = m_wndStatusBar.CommandToIndex(nLabelId); m_wndStatusBar.SetPaneWidth(nIndex, 110); m_wndStatusBar.AddPaneControl(m_pWndLabel, nLabelId, true); return 0; } Now you can update it, like in a OnTimer handler to update the pane: m_wndStatusBar.SetPaneText(m_wndStatusBar.GetCount()-1, sztime); -- HLS
|
Pages: 1 Prev: Why i am Getting Error regarding to Just in Time Next: USB support. |