185 lines
5.1 KiB
C++
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;
|
|
}
|