📄 formatbar.cpp
字号:
if (map.Lookup(pDesc->m_strName, pv)) // found it
{
if (pv == NULL) // only one entry so far
{
map.RemoveKey(pDesc->m_strName);
map.SetAt(pDesc->m_strName, (void*)1);
}
}
else // not found
map.SetAt(pDesc->m_strName, (void*)0);
}
for (i = 0; i<nCount;i++)
{
CFontDesc* pDesc = (CFontDesc*)m_arrayFontDesc[i];
CString str = pDesc->m_strName;
void* pv = NULL;
VERIFY(map.Lookup(str, pv));
if (pv != NULL && !pDesc->m_strScript.IsEmpty())
{
str += " (";
str += pDesc->m_strScript;
str += ")";
}
int nIndex = AddString(str);
ASSERT(nIndex >=0);
if (nIndex >=0) //no error
SetItemData(nIndex, (DWORD)pDesc);
}
SetTheText(str);
m_arrayFontDesc.RemoveAll();
}
void CFontComboBox::AddFont(ENUMLOGFONT* pelf, DWORD dwType, LPCTSTR lpszScript)
{
LOGFONT& lf = pelf->elfLogFont;
if (lf.lfCharSet == MAC_CHARSET) // don't put in MAC fonts, commdlg doesn't either
return;
// Don't display vertical font for FE platform
if ((GetSystemMetrics(SM_DBCSENABLED)) && (lf.lfFaceName[0] == '@'))
return;
// don't put in non-printer raster fonts
CFontDesc* pDesc = new CFontDesc(lf.lfFaceName, lpszScript,
lf.lfCharSet, lf.lfPitchAndFamily, dwType);
m_arrayFontDesc.Add(pDesc);
}
BOOL CALLBACK AFX_EXPORT CFontComboBox::EnumFamScreenCallBack(ENUMLOGFONT* pelf,
NEWTEXTMETRICEX* /*lpntm*/, int FontType, LPVOID pThis)
{
// don't put in non-printer raster fonts
if (FontType & RASTER_FONTTYPE)
return 1;
DWORD dwData = (FontType & TRUETYPE_FONTTYPE) ? TT_FONT : 0;
((CFontComboBox *)pThis)->AddFont(pelf, dwData);
return 1;
}
BOOL CALLBACK AFX_EXPORT CFontComboBox::EnumFamPrinterCallBack(ENUMLOGFONT* pelf,
NEWTEXTMETRICEX* /*lpntm*/, int FontType, LPVOID pThis)
{
DWORD dwData = PRINTER_FONT;
if (FontType & TRUETYPE_FONTTYPE)
dwData |= TT_FONT;
else if (FontType & DEVICE_FONTTYPE)
dwData |= DEVICE_FONT;
((CFontComboBox *)pThis)->AddFont(pelf, dwData);
return 1;
}
BOOL CALLBACK AFX_EXPORT CFontComboBox::EnumFamScreenCallBackEx(ENUMLOGFONTEX* pelf,
NEWTEXTMETRICEX* /*lpntm*/, int FontType, LPVOID pThis)
{
// don't put in non-printer raster fonts
if (FontType & RASTER_FONTTYPE)
return 1;
DWORD dwData = (FontType & TRUETYPE_FONTTYPE) ? TT_FONT : 0;
((CFontComboBox *)pThis)->AddFont((ENUMLOGFONT*)pelf, dwData, CString(pelf->elfScript));
return 1;
}
BOOL CALLBACK AFX_EXPORT CFontComboBox::EnumFamPrinterCallBackEx(ENUMLOGFONTEX* pelf,
NEWTEXTMETRICEX* /*lpntm*/, int FontType, LPVOID pThis)
{
DWORD dwData = PRINTER_FONT;
if (FontType & TRUETYPE_FONTTYPE)
dwData |= TT_FONT;
else if (FontType & DEVICE_FONTTYPE)
dwData |= DEVICE_FONT;
((CFontComboBox *)pThis)->AddFont((ENUMLOGFONT*)pelf, dwData, CString(pelf->elfScript));
return 1;
}
void CFontComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
ASSERT(lpDIS->CtlType == ODT_COMBOBOX);
int id = (int)(WORD)lpDIS->itemID;
CDC *pDC = CDC::FromHandle(lpDIS->hDC);
CRect rc(lpDIS->rcItem);
if (lpDIS->itemState & ODS_FOCUS)
pDC->DrawFocusRect(rc);
int nIndexDC = pDC->SaveDC();
CBrush brushFill;
if (lpDIS->itemState & ODS_SELECTED)
{
brushFill.CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
}
else
brushFill.CreateSolidBrush(pDC->GetBkColor());
pDC->SetBkMode(TRANSPARENT);
pDC->FillRect(rc, &brushFill);
CFontDesc* pDesc= (CFontDesc*)lpDIS->itemData;
ASSERT(pDesc != NULL);
DWORD dwData = pDesc->m_dwFlags;
if (dwData & (TT_FONT|DEVICE_FONT)) // truetype or device flag set by SetItemData
{
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap* pBitmap = dc.SelectObject(&m_bmFontType);
if (dwData & TT_FONT)
pDC->BitBlt(rc.left, rc.top, BMW, BMH, &dc, BMW, 0, SRCAND);
else // DEVICE_FONT
pDC->BitBlt(rc.left, rc.top, BMW, BMH, &dc, 0, 0, SRCAND);
dc.SelectObject(pBitmap);
}
rc.left += BMW + 6;
CString strText;
GetLBText(id, strText);
pDC->TextOut(rc.left,rc.top,strText,strText.GetLength());
pDC->RestoreDC(nIndexDC);
}
void CFontComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
{
ASSERT(lpMIS->CtlType == ODT_COMBOBOX);
ASSERT(m_nFontHeight > 0);
CRect rc;
GetWindowRect(&rc);
lpMIS->itemWidth = rc.Width();
lpMIS->itemHeight = max(BMH, m_nFontHeight);
}
int CFontComboBox::CompareItem(LPCOMPAREITEMSTRUCT lpCIS)
{
ASSERT(lpCIS->CtlType == ODT_COMBOBOX);
int id1 = (int)(WORD)lpCIS->itemID1;
int id2 = (int)(WORD)lpCIS->itemID2;
CString str1,str2;
if (id1 == -1)
return -1;
if (id2 == -1)
return 1;
GetLBText(id1, str1);
GetLBText(id2, str2);
return str1.Collate(str2);
}
// find a font with the face name and charset
void CFontComboBox::MatchFont(LPCTSTR lpszName, BYTE nCharSet)
{
int nFirstIndex = FindString(-1, lpszName);
if (nFirstIndex != CB_ERR)
{
int nIndex = nFirstIndex;
do
{
CFontDesc* pDesc = (CFontDesc*)GetItemData(nIndex);
ASSERT(pDesc != NULL);
// check the actual font name to avoid matching Courier western
// to Courier New western
if ((nCharSet == DEFAULT_CHARSET || pDesc->m_nCharSet == nCharSet) &&
lstrcmp(lpszName, pDesc->m_strName)==0)
{
//got a match
if (GetCurSel() != nIndex)
SetCurSel(nIndex);
return;
}
nIndex = FindString(nIndex, lpszName);
} while (nIndex != nFirstIndex);
// loop until found or back to first item again
}
//enter font name
SetTheText(lpszName, TRUE);
}
/////////////////////////////////////////////////////////////////////////////
// CSizeComboBox
CSizeComboBox::CSizeComboBox()
{
m_nTwipsLast = 0;
}
void CSizeComboBox::EnumFontSizes(CDC& dc, LPCTSTR pFontName)
{
ResetContent();
if (pFontName == NULL)
return;
if (pFontName[0] == NULL)
return;
ASSERT(dc.m_hDC != NULL);
m_nLogVert = dc.GetDeviceCaps(LOGPIXELSY);
::EnumFontFamilies(dc.m_hDC, pFontName,
(FONTENUMPROC) EnumSizeCallBack, (LPARAM) this);
}
void CSizeComboBox::TwipsToPointString(LPTSTR lpszBuf, int nTwips)
{
ASSERT(lpszBuf != NULL);
lpszBuf[0] = NULL;
if (nTwips >= 0)
{
// round to nearest half point
nTwips = (nTwips+5)/10;
if ((nTwips%2) == 0)
_stprintf(lpszBuf, _T("%ld"), nTwips/2);
else
_stprintf(lpszBuf, _T("%.1f"), (float)nTwips/2.F);
}
}
void CSizeComboBox::SetTwipSize(int nTwips)
{
if (nTwips != GetTwipSize())
{
TCHAR buf[10];
TwipsToPointString(buf, nTwips);
SetTheText(buf, TRUE);
}
m_nTwipsLast = nTwips;
}
int CSizeComboBox::GetTwipSize()
{
// return values
// -2 -- error
// -1 -- edit box empty
// >=0 -- font size in twips
CString str;
GetTheText(str);
LPCTSTR lpszText = str;
while (*lpszText == ' ' || *lpszText == '\t')
lpszText++;
if (lpszText[0] == NULL)
return -1; // no text in control
double d = _tcstod(lpszText, (LPTSTR*)&lpszText);
while (*lpszText == ' ' || *lpszText == '\t')
lpszText++;
if (*lpszText != NULL)
return -2; // not terminated properly
return (d<0.) ? 0 : (int)(d*20.);
}
BOOL CALLBACK AFX_EXPORT CSizeComboBox::EnumSizeCallBack(LOGFONT FAR* /*lplf*/,
LPNEWTEXTMETRIC lpntm, int FontType, LPVOID lpv)
{
CSizeComboBox* pThis = (CSizeComboBox*)lpv;
ASSERT(pThis != NULL);
TCHAR buf[10];
if (
(FontType & TRUETYPE_FONTTYPE) ||
!( (FontType & TRUETYPE_FONTTYPE) || (FontType & RASTER_FONTTYPE) )
) // if truetype or vector font
{
// this occurs when there is a truetype and nontruetype version of a font
if (pThis->GetCount() != 0)
pThis->ResetContent();
for (int i = 0; i < 16; i++)
{
wsprintf(buf, _T("%d"), nFontSizes[i]);
pThis->AddString(buf);
}
return FALSE; // don't call me again
}
// calc character height in pixels
pThis->InsertSize(MulDiv(lpntm->tmHeight-lpntm->tmInternalLeading,
1440, pThis->m_nLogVert));
return TRUE; // call me again
}
void CSizeComboBox::InsertSize(int nSize)
{
ASSERT(nSize > 0);
DWORD dwSize = (DWORD)nSize;
TCHAR buf[10];
TwipsToPointString(buf, nSize);
if (FindStringExact(-1, buf) == CB_ERR)
{
int nIndex = -1;
int nPos = 0;
DWORD dw;
while ((dw = GetItemData(nPos)) != CB_ERR)
{
if (dw > dwSize)
{
nIndex = nPos;
break;
}
nPos++;
}
nIndex = InsertString(nIndex, buf);
ASSERT(nIndex != CB_ERR);
if (nIndex != CB_ERR)
SetItemData(nIndex, dwSize);
}
}
/////////////////////////////////////////////////////////////////////////////
// CLocalComboBox
BEGIN_MESSAGE_MAP(CLocalComboBox, CComboBox)
//{{AFX_MSG_MAP(CLocalComboBox)
ON_WM_CREATE()
//}}AFX_MSG_MAP
// Global help commands
END_MESSAGE_MAP()
void CLocalComboBox::GetTheText(CString& str)
{
int nIndex = GetCurSel();
if (nIndex == CB_ERR)
GetWindowText(str);
else
GetLBText(nIndex, str);
}
void CLocalComboBox::SetTheText(LPCTSTR lpszText,BOOL bMatchExact)
{
int idx = (bMatchExact) ? FindStringExact(-1,lpszText) :
FindString(-1, lpszText);
SetCurSel( (idx==CB_ERR) ? -1 : idx);
if (idx == CB_ERR)
SetWindowText(lpszText);
}
BOOL CLocalComboBox::LimitText(int nMaxChars)
{
BOOL b = CComboBox::LimitText(nMaxChars);
if (b)
m_nLimitText = nMaxChars;
return b;
}
int CLocalComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CComboBox::OnCreate(lpCreateStruct) == -1)
return -1;
SendMessage(WM_SETFONT, (WPARAM)GetStockObject(theApp.m_nDefFont));
return 0;
}
BOOL CLocalComboBox::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
CFormatBar* pBar = (CFormatBar*)GetParent();
switch (pMsg->wParam)
{
case VK_ESCAPE:
pBar->SyncToView();
pBar->NotifyOwner(NM_RETURN);
return TRUE;
case VK_RETURN:
pBar->NotifyOwner(NM_RETURN);
return TRUE;
case VK_TAB:
pBar->GetNextDlgTabItem(this)->SetFocus();
return TRUE;
case VK_UP:
case VK_DOWN:
if ((GetKeyState(VK_MENU) >= 0) && (GetKeyState(VK_CONTROL) >=0) &&
!GetDroppedState())
{
ShowDropDown();
return TRUE;
}
}
}
return CComboBox::PreTranslateMessage(pMsg);
}
void CFormatBar::NotifyOwner(UINT nCode)
{
NMHDR nm;
nm.hwndFrom = m_hWnd;
nm.idFrom = GetDlgCtrlID();
nm.code = nCode;
GetOwner()->SendMessage(WM_NOTIFY, nm.idFrom, (LPARAM)&nm);
}
void CFormatBar::SetCharFormat(CCharFormat& cf)
{
CHARHDR fnm;
fnm.hwndFrom = m_hWnd;
fnm.idFrom = GetDlgCtrlID();
fnm.code = FN_SETFORMAT;
fnm.cf = cf;
VERIFY(GetOwner()->SendMessage(WM_NOTIFY, fnm.idFrom, (LPARAM)&fnm));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -