📄 barstat.cpp
字号:
pSBP->nFlags |= SBPF_UPDATE;
SetPaneText(nIndex, pSBP->strText);
}
pSBP->nStyle = nStyle;
}
if (cxWidth != pSBP->cxText)
{
// change width of one pane -> invalidate the entire status bar
pSBP->cxText = cxWidth;
bChanged = TRUE;
}
if (bChanged)
UpdateAllPanes(TRUE, FALSE);
}
void CStatusBar::GetPaneText(int nIndex, CString& s) const
{
ASSERT_VALID(this);
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
s = pSBP->strText;
}
CString CStatusBar::GetPaneText(int nIndex) const
{
ASSERT_VALID(this);
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
return pSBP->strText;
}
BOOL CStatusBar::SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
if (!(pSBP->nFlags & SBPF_UPDATE) &&
((lpszNewText == NULL && pSBP->strText.IsEmpty()) ||
(lpszNewText != NULL && pSBP->strText.Compare(lpszNewText) == 0)))
{
// nothing to change
return TRUE;
}
TRY
{
if (lpszNewText != NULL)
pSBP->strText = lpszNewText;
else
pSBP->strText.Empty();
}
CATCH_ALL(e)
{
// Note: DELETE_EXCEPTION(e) not required
return FALSE;
}
END_CATCH_ALL
if (!bUpdate)
{
// can't update now, wait until later
pSBP->nFlags |= SBPF_UPDATE;
return TRUE;
}
pSBP->nFlags &= ~SBPF_UPDATE;
DefWindowProc(SB_SETTEXT, ((WORD)pSBP->nStyle)|nIndex,
(pSBP->nStyle & SBPS_DISABLED) ? NULL :
(LPARAM)(LPCTSTR)pSBP->strText);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CStatusBar implementation
CSize CStatusBar::CalcFixedLayout(BOOL, BOOL bHorz)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
// determinme size of font being used by the status bar
TEXTMETRIC tm;
{
CClientDC dc(NULL);
HFONT hFont = (HFONT)SendMessage(WM_GETFONT);
HGDIOBJ hOldFont = NULL;
if (hFont != NULL)
hOldFont = dc.SelectObject(hFont);
VERIFY(dc.GetTextMetrics(&tm));
if (hOldFont != NULL)
dc.SelectObject(hOldFont);
}
// get border information
CRect rect; rect.SetRectEmpty();
CalcInsideRect(rect, bHorz);
int rgBorders[3];
DefWindowProc(SB_GETBORDERS, 0, (LPARAM)&rgBorders);
// determine size, including borders
CSize size;
size.cx = 32767;
size.cy = tm.tmHeight - tm.tmInternalLeading - 1
+ rgBorders[1] * 2 + ::GetSystemMetrics(SM_CYBORDER) * 2
- rect.Height();
if (size.cy < m_nMinHeight)
size.cy = m_nMinHeight;
return size;
}
/////////////////////////////////////////////////////////////////////////////
// CStatusBar message handlers
BEGIN_MESSAGE_MAP(CStatusBar, CControlBar)
//{{AFX_MSG_MAP(CStatusBar)
ON_WM_NCHITTEST()
ON_WM_NCPAINT()
ON_WM_PAINT()
ON_WM_NCCALCSIZE()
ON_WM_SIZE()
ON_WM_WINDOWPOSCHANGING()
ON_MESSAGE(WM_SETTEXT, OnSetText)
ON_MESSAGE(WM_GETTEXT, OnGetText)
ON_MESSAGE(WM_GETTEXTLENGTH, OnGetTextLength)
ON_MESSAGE(SB_SETMINHEIGHT, OnSetMinHeight)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
UINT CStatusBar::OnNcHitTest(CPoint)
{
UINT nResult = (UINT)Default();
if (nResult == HTBOTTOMRIGHT)
return HTBOTTOMRIGHT;
else
return HTCLIENT;
}
void CStatusBar::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS* lpncsp)
{
// calculate border space (will add to top/bottom, subtract from right/bottom)
CRect rect; rect.SetRectEmpty();
CControlBar::CalcInsideRect(rect, TRUE);
ASSERT(rect.top >= 2);
// adjust non-client area for border space
lpncsp->rgrc[0].left += rect.left;
lpncsp->rgrc[0].top += rect.top - 2;
lpncsp->rgrc[0].right += rect.right;
lpncsp->rgrc[0].bottom += rect.bottom;
}
void CStatusBar::OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle)
{
if (m_hWnd != NULL &&
((dwOldStyle & CBRS_BORDER_ANY) != (dwNewStyle & CBRS_BORDER_ANY)))
{
// recalc non-client area when border styles change
SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_DRAWFRAME);
}
}
void CStatusBar::OnNcPaint()
{
EraseNonClient();
}
// Derived class is responsible for implementing all of these handlers
// for owner/self draw controls.
void CStatusBar::DrawItem(LPDRAWITEMSTRUCT)
{
ASSERT(FALSE);
}
BOOL CStatusBar::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (message != WM_DRAWITEM)
return CWnd::OnChildNotify(message, wParam, lParam, pResult);
ASSERT(pResult == NULL);
UNUSED(pResult); // unused in release builds
DrawItem((LPDRAWITEMSTRUCT)lParam);
return TRUE;
}
void CStatusBar::OnPaint()
{
UpdateAllPanes(FALSE, TRUE);
Default();
}
void CStatusBar::OnSize(UINT nType, int cx, int cy)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
CControlBar::OnSize(nType, cx, cy);
// need to adjust pane right edges (because of stretchy pane)
UpdateAllPanes(TRUE, FALSE);
}
void CStatusBar::OnWindowPosChanging(LPWINDOWPOS lpWndPos)
{
// not necessary to invalidate the borders
DWORD dwStyle = m_dwStyle;
m_dwStyle &= ~(CBRS_BORDER_ANY);
CControlBar::OnWindowPosChanging(lpWndPos);
m_dwStyle = dwStyle;
}
LRESULT CStatusBar::OnSetText(WPARAM, LPARAM lParam)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
int nIndex = CommandToIndex(0);
if (nIndex < 0)
return -1;
return SetPaneText(nIndex, (LPCTSTR)lParam) ? 0 : -1;
}
LRESULT CStatusBar::OnGetText(WPARAM wParam, LPARAM lParam)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
int nMaxLen = (int)wParam;
if (nMaxLen == 0)
return 0; // nothing copied
LPTSTR lpszDest = (LPTSTR)lParam;
int nLen = 0;
int nIndex = CommandToIndex(0); // use pane with ID zero
if (nIndex >= 0)
{
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
nLen = pSBP->strText.GetLength();
if (nLen > nMaxLen)
nLen = nMaxLen - 1; // number of characters to copy (less term.)
memcpy(lpszDest, (LPCTSTR)pSBP->strText, nLen*sizeof(TCHAR));
}
lpszDest[nLen] = '\0';
return nLen+1; // number of bytes copied
}
LRESULT CStatusBar::OnGetTextLength(WPARAM, LPARAM)
{
ASSERT_VALID(this);
ASSERT(::IsWindow(m_hWnd));
int nLen = 0;
int nIndex = CommandToIndex(0); // use pane with ID zero
if (nIndex >= 0)
{
AFX_STATUSPANE* pSBP = _GetPanePtr(nIndex);
nLen = pSBP->strText.GetLength();
}
return nLen;
}
LRESULT CStatusBar::OnSetMinHeight(WPARAM wParam, LPARAM)
{
LRESULT lResult = Default();
m_nMinHeight = wParam;
return lResult;
}
/////////////////////////////////////////////////////////////////////////////
// CStatusBar idle update through CStatusCmdUI class
class CStatusCmdUI : public CCmdUI // class private to this file!
{
public: // re-implementations only
virtual void Enable(BOOL bOn);
virtual void SetCheck(int nCheck);
virtual void SetText(LPCTSTR lpszText);
};
void CStatusCmdUI::Enable(BOOL bOn)
{
m_bEnableChanged = TRUE;
CStatusBar* pStatusBar = (CStatusBar*)m_pOther;
ASSERT(pStatusBar != NULL);
ASSERT_KINDOF(CStatusBar, pStatusBar);
ASSERT(m_nIndex < m_nIndexMax);
UINT nNewStyle = pStatusBar->GetPaneStyle(m_nIndex) & ~SBPS_DISABLED;
if (!bOn)
nNewStyle |= SBPS_DISABLED;
pStatusBar->SetPaneStyle(m_nIndex, nNewStyle);
}
void CStatusCmdUI::SetCheck(int nCheck) // "checking" will pop out the text
{
CStatusBar* pStatusBar = (CStatusBar*)m_pOther;
ASSERT(pStatusBar != NULL);
ASSERT_KINDOF(CStatusBar, pStatusBar);
ASSERT(m_nIndex < m_nIndexMax);
UINT nNewStyle = pStatusBar->GetPaneStyle(m_nIndex) & ~SBPS_POPOUT;
if (nCheck != 0)
nNewStyle |= SBPS_POPOUT;
pStatusBar->SetPaneStyle(m_nIndex, nNewStyle);
}
void CStatusCmdUI::SetText(LPCTSTR lpszText)
{
CStatusBar* pStatusBar = (CStatusBar*)m_pOther;
ASSERT(pStatusBar != NULL);
ASSERT_KINDOF(CStatusBar, pStatusBar);
ASSERT(m_nIndex < m_nIndexMax);
pStatusBar->SetPaneText(m_nIndex, lpszText);
}
void CStatusBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
CStatusCmdUI state;
state.m_pOther = this;
state.m_nIndexMax = (UINT)m_nCount;
for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
state.m_nIndex++)
{
state.m_nID = _GetPanePtr(state.m_nIndex)->nID;
// allow the statusbar itself to have update handlers
if (CWnd::OnCmdMsg(state.m_nID, CN_UPDATE_COMMAND_UI, &state, NULL))
continue;
// allow target (owner) to handle the remaining updates
state.DoUpdate(pTarget, FALSE);
}
// update the dialog controls added to the status bar
UpdateDialogControls(pTarget, bDisableIfNoHndler);
}
/////////////////////////////////////////////////////////////////////////////
// CStatusBar diagnostics
#ifdef _DEBUG
void CStatusBar::AssertValid() const
{
CControlBar::AssertValid();
}
void CStatusBar::Dump(CDumpContext& dc) const
{
CControlBar::Dump(dc);
if (dc.GetDepth() > 0)
{
for (int i = 0; i < m_nCount; i++)
{
dc << "\nstatus pane[" << i << "] = {";
dc << "\n\tnID = " << _GetPanePtr(i)->nID;
dc << "\n\tnStyle = " << _GetPanePtr(i)->nStyle;
dc << "\n\tcxText = " << _GetPanePtr(i)->cxText;
dc << "\n\tstrText = " << _GetPanePtr(i)->strText;
dc << "\n\t}";
}
}
dc << "\n";
}
#endif //_DEBUG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CStatusBar, CControlBar)
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -