Re: How To: CStatubar panel Right-align text
Hector Santos wrote:
Ajay Kalra wrote:
On Mar 27, 3:58 pm, Hector Santos <sant9...@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