windows-nt/Source/XPSP1/NT/windows/feime/cht/cblocks/mystatus.cpp
2020-09-26 16:20:57 +08:00

185 lines
5.1 KiB
C++

/*************************************************
* mystatus.cpp *
* *
* Copyright (C) 1995-1999 Microsoft Inc. *
* *
*************************************************/
#include "stdafx.h"
#include "mystatus.h"
#define SBPF_UPDATE 0x0001 // pending update of text
struct AFX_STATUSPANE
{
UINT nID; // IDC of indicator: 0 => normal text area
int cxText; // width of string area in pixels
// on both sides there is a 3 pixel gap and
// a one pixel border, making a pane 6 pixels wider
UINT nStyle; // style flags (SBPS_*)
UINT nFlags; // state flags (SBPF_*)
CString strText; // text in the pane
};
/*
struct AFX_STATUSPANE
{
UINT nID; // IDC of indicator: 0 => normal text area
UINT nStyle; // style flags (SBPS_*)
int cxText; // width of string area in pixels
// on both sides there is a 1 pixel gap and
// a one pixel border, making a pane 4 pixels wider
LPCTSTR lpszText; // text in the pane
};
*/
inline AFX_STATUSPANE* CStatusBar::_GetPanePtr(int nIndex) const
{
ASSERT((nIndex >= 0 && nIndex < m_nCount) || m_nCount == 0);
return ((AFX_STATUSPANE*)m_pData) + nIndex;
}
/*
BOOL CMyStatusBar::SetIndicators(const UINT* lpIDArray, int nIDCount)
{
ASSERT_VALID(this);
ASSERT(nIDCount >= 1); // must be at least one of them
ASSERT(lpIDArray == NULL ||
AfxIsValidAddress(lpIDArray, sizeof(UINT) * nIDCount, FALSE));
// free strings before freeing array of elements
for (int i = 0; i < m_nCount; i++)
VERIFY(SetPaneText(i, NULL, FALSE)); // no update
// first allocate array for panes and copy initial data
if (!AllocElements(nIDCount, sizeof(AFX_STATUSPANE)))
return FALSE;
ASSERT(nIDCount == m_nCount);
BOOL bOK = TRUE;
if (lpIDArray != NULL)
{
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lstrcpy(lf.lfFaceName,TEXT("²Ó©úÅé"));
lf.lfHeight=12;
lf.lfCharSet=DEFAULT_CHARSET;
HFONT hFont = ::CreateFontIndirect(&lf);
ASSERT(hFont != NULL); // must have a font !
CString strText;
CClientDC dcScreen(NULL);
HGDIOBJ hOldFont = dcScreen.SelectObject(hFont);
for (int i = 0; i < nIDCount; i++)
{
AFX_STATUSPANE* pSBP = _GetPanePtr(i);
pSBP->nID = *lpIDArray++;
if (pSBP->nID != 0)
{
if (!strText.LoadString(pSBP->nID))
{
TRACE1("Warning: failed to load indicator string 0x%04X.\n",
pSBP->nID);
bOK = FALSE;
break;
}
pSBP->cxText = dcScreen.GetTextExtent(strText,
strText.GetLength()).cx;
ASSERT(pSBP->cxText >= 0);
if (!SetPaneText(i, strText, FALSE))
{
bOK = FALSE;
break;
}
}
else
{
// no indicator (must access via index)
// default to 1/4 the screen width (first pane is stretchy)
if (!(pSBP->cxText = dcScreen.GetTextExtent(TEXT("0123456789"),lstrlen("0123456789")).cx))
pSBP->cxText = ::GetSystemMetrics(SM_CXSCREEN)/4;
if (i == 0)
pSBP->nStyle |= (SBPS_STRETCH | SBPS_NOBORDERS);
}
}
dcScreen.SelectObject(hOldFont);
}
return bOK;
}
*/
BOOL CMyStatusBar::SetIndicators(const UINT* lpIDArray, int nIDCount)
{
ASSERT_VALID(this);
ASSERT(nIDCount >= 1); // must be at least one of them
ASSERT(lpIDArray == NULL ||
AfxIsValidAddress(lpIDArray, sizeof(UINT) * nIDCount, FALSE));
ASSERT(::IsWindow(m_hWnd));
// first allocate array for panes and copy initial data
if (!AllocElements(nIDCount, sizeof(AFX_STATUSPANE)))
return FALSE;
ASSERT(nIDCount == m_nCount);
// copy initial data from indicator array
BOOL bResult = TRUE;
if (lpIDArray != NULL)
{
// Code merge from 3.51 'cblocks'. weiwu 6/26
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lstrcpy(lf.lfFaceName,TEXT("²Ó©úÅé"));
lf.lfHeight=12;
lf.lfCharSet=DEFAULT_CHARSET;
HFONT hFont = ::CreateFontIndirect(&lf);
// HFONT hFont = (HFONT)SendMessage(WM_GETFONT);
CClientDC dcScreen(NULL);
HGDIOBJ hOldFont = NULL;
if (hFont != NULL)
hOldFont = dcScreen.SelectObject(hFont);
AFX_STATUSPANE* pSBP = _GetPanePtr(0);
for (int i = 0; i < nIDCount; i++)
{
pSBP->nID = *lpIDArray++;
pSBP->nFlags |= SBPF_UPDATE;
if (pSBP->nID != 0)
{
if (!pSBP->strText.LoadString(pSBP->nID))
{
TRACE1("Warning: failed to load indicator string 0x%04X.\n",
pSBP->nID);
bResult = FALSE;
break;
}
pSBP->cxText = dcScreen.GetTextExtent(pSBP->strText).cx;
ASSERT(pSBP->cxText >= 0);
if (!SetPaneText(i, pSBP->strText, FALSE))
{
bResult = FALSE;
break;
}
}
else
{
// no indicator (must access via index)
// default to 1/4 the screen width (first pane is stretchy)
// Code merge from 3.51 weiwu 6/26
/*
pSBP->cxText = ::GetSystemMetrics(SM_CXSCREEN)/4;
*/
if (!(pSBP->cxText = dcScreen.GetTextExtent(TEXT("0123456789"),lstrlen("0123456789")).cx))
pSBP->cxText = ::GetSystemMetrics(SM_CXSCREEN)/4;
if (i == 0)
pSBP->nStyle |= (SBPS_STRETCH | SBPS_NOBORDERS);
}
++pSBP;
}
if (hOldFont != NULL)
dcScreen.SelectObject(hOldFont);
}
UpdateAllPanes(TRUE, TRUE);
return bResult;
}