From: Ajay Kalra on
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
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
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