/******************************************************************************/ /* Tfont.CPP: IMPLEMENTATION OF THE CTfont CLASS which encapsulates the */ /* CTfondDlg and CTfontTbar classes */ /* */ /******************************************************************************/ /* */ /* Methods in this file */ /* */ /* TextFont Object */ /* CTfont::CTfont */ /* CTfont::CTfont */ /* CTfont::~CTfont */ /* CTfont::EmptyMap */ /* CTfont::FreeMemoryFromCBox */ /* */ /* Miscellaneous Methods */ /* CTfont::Create */ /* CTfont::Undo */ /* CTfont::RefreshToolBar */ /* CTfont::ResizeWindow */ /* CTfont::DrawItem */ /* CTfont::SetColorsInDC */ /* CTfont::SaveToIniFile */ /* CTfont::RestoreFontAttrsFromIniFile */ /* CTfont::ReadFromIniFile */ /* */ /* Font/Size enumeration methods */ /* CTfont::RefreshFontList */ /* CTfont::EnumFontFace */ /* CTfont::EnumFontFaceProc */ /* CTfont::EnumFontSizes */ /* CTfont::EnumFontOneFaceProc */ /* */ /* Combo Box Notification and processing methods */ /* CTfont::ProcessNewTypeface */ /* CTfont::UpdateEditControlFont */ /* CTfont::OnTypeFaceComboBoxUpdate */ /* CTfont::OnPointSizeComboBoxUpdate */ /* CTfont::OnTypefaceChange */ /* CTfont::OnPointSizeChange */ /* CTfont::OnRButtonDown */ /* */ /* */ /* Control Notification/Window Messages */ /* CTfont::OnMove */ /* CTfont::OnClose */ /* CTfont::OnSetFocus */ /* CTfont::OnDestroy */ /* CTfont::OnBold */ /* CTfont::OnItalic */ /* CTfont::OnUnderline */ /* CTfont::OnShadow */ /* CTfont::OnPen */ /* CTfont::OnEditText */ /* CTfont::OnKeyboard */ /* CTfont::OnInsSpace */ /* CTfont::OnBackSpace */ /* CTfont::OnNewLine */ /* CTfont::OnDrawItem */ /* CTfont::OnMeasureItem */ /* */ /******************************************************************************/ /* */ /* Tool Bar Object */ /* CTfontTbar::CTfontTbar */ /* CTfontTbar::Create */ /* CTfontTbar::~CTfontTbar */ /* */ /******************************************************************************/ /* */ /* Dialog Bar Object */ /* TfontDlg::CTfontDlg(void) */ /* TfontDlg::Create(CWnd* pcParentWnd) */ /* TfontDlg::~CTfontDlg(void) */ /* TfontDlg::OnRButtonDown */ /* */ /* */ /******************************************************************************/ #include "stdafx.h" #include #include #include "global.h" #include "pbrush.h" #include "pbrusfrm.h" #include "pbrusvw.h" #include "pictures.h" #include "resource.h" #include "minifwnd.h" #include "Tfont.h" #include "Tedit.h" #ifndef NT #include // soe we can bring up the lens from the toolbar #endif #ifdef _DEBUG #undef THIS_FILE static CHAR BASED_CODE THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE( CTfont, CMiniFrmWnd ) IMPLEMENT_DYNCREATE( CTfontTbar, CToolBar ) IMPLEMENT_DYNCREATE( CTfontDlg, CDialogBar ) #include "memtrace.h" UINT CTBitmaps[] = {FONT_TT_BMP, FONT_PRN_BMP, TT_OPENTYPE_BMP, PS_OPENTYPE_BMP, TYPE1_BMP}; /******************************************************************************/ class CCharSetDesc { public: CCharSetDesc(LPCTSTR lpszScript, BYTE nCharSet); CString m_strScript; BYTE m_nCharSet; CCharSetDesc *m_pNext; }; CCharSetDesc::CCharSetDesc(LPCTSTR lpszScript, BYTE nCharSet) { m_strScript = lpszScript; m_nCharSet = nCharSet; m_pNext = NULL; } /******************************************************************************/ class CFontDesc { public: CFontDesc(LPCTSTR lpszName, LPCTSTR lpszScript, BYTE nCharSet, int iFontType); ~CFontDesc(); CString m_strName; CCharSetDesc m_CharSetDesc; int m_iFontType; }; CFontDesc::CFontDesc(LPCTSTR lpszName, LPCTSTR lpszScript, BYTE nCharSet, int iFontType) : m_CharSetDesc(lpszScript, nCharSet) { m_strName = lpszName; m_iFontType = iFontType; } CFontDesc::~CFontDesc() { // delete the charset list entries CCharSetDesc *pCharSetDesc = m_CharSetDesc.m_pNext; while (pCharSetDesc) { CCharSetDesc *pTemp = pCharSetDesc; pCharSetDesc = pCharSetDesc->m_pNext; delete pTemp; } } /******************************************************************************/ class CFontComboBox : public CComboBox { public: int AddFontName(LPCTSTR lpszName, LPCTSTR lpszScript, BYTE nCharSet, int iFontType); CFontDesc* GetFontDesc(int nIndex) {return (CFontDesc*)GetItemData(nIndex);}; BOOL IsSameName(CFontDesc* pDesc, int index); // I'm not really doing the message map stuff void ClearList(); } ; /******************************************************************************/ class CCharSetComboBox : public CComboBox { public: int AddCharSet(LPCTSTR lpszScript, BYTE nCharSet); int SelectCharSet(int nStartAfter, BYTE nCharSet); int GetCurSelCharSet(); } ; /******************************************************************************/ // // HACKHACK: All this history stuff is to help make choosing a script for // a font easier. There doesn't seem to be anyway to get a "good" script // for a given font/locale so what we do is save the last serveral scripts // and hope that the font the user just switched to supports one of them. // class CHistoryList { public: CHistoryList(); void AddHead(int nNewItem); int GetAt (unsigned int uIndex); enum { m_uHistorySize = 4 }; private: unsigned int m_uHistoryIndex; int m_HistoryList[m_uHistorySize]; }; CHistoryList::CHistoryList() { m_uHistoryIndex = 0; for (int i = 0; i < m_uHistorySize; ++i) { m_HistoryList[i] = -1; } } void CHistoryList::AddHead(int nNewItem) { m_HistoryList[(++m_uHistoryIndex) % m_uHistorySize] = nNewItem; } int CHistoryList::GetAt(unsigned int uIndex) { ASSERT((int)uIndex >= 0 && uIndex < m_uHistorySize); return m_HistoryList[(m_uHistoryIndex-uIndex) % m_uHistorySize]; } static CHistoryList g_CharSetHistoryList; /******************************************************************************/ // CTfont BEGIN_MESSAGE_MAP( CTfont, CMiniFrmWnd ) //{{AFX_MSG_MAP(CTfont) ON_CBN_SELCHANGE(IDC_TYPEFACE, OnTypefaceChange) ON_CBN_SELCHANGE(IDC_POINTSIZE, OnPointSizeChange) ON_CBN_KILLFOCUS(IDC_POINTSIZE, OnPointSizeChange) ON_COMMAND(IDOK, OnPointSizeChange) ON_CBN_SELCHANGE(IDC_CHARSET, OnTypefaceChange) ON_WM_ERASEBKGND() ON_WM_SETFOCUS() ON_WM_DESTROY() ON_WM_MOVE() ON_WM_CLOSE() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_COMMAND(IDC_BOLD, OnBold) ON_COMMAND(IDC_ITALIC, OnItalic) ON_COMMAND(IDC_UNDERLINE, OnUnderline) ON_COMMAND(IDC_VERTEDIT, OnVertEdit) ON_UPDATE_COMMAND_UI(IDC_VERTEDIT, OnVertEditUpdate) ON_COMMAND(IDC_SHADOW, OnShadow) ON_COMMAND(IDC_PENEXT, OnPen) ON_COMMAND(IDC_EDITTEXT, OnEditText) ON_COMMAND(IDC_KEYBOARD, OnKeyboard) ON_COMMAND(IDC_INS_SPACE, OnInsSpace) ON_COMMAND(IDC_BACKSPACE, OnBackSpace) ON_COMMAND(IDC_NEWLINE, OnNewLine) //}}AFX_MSG_MAP ON_MESSAGE(UM_DELAYED_TOOLBAR, OnDelayedPen) END_MESSAGE_MAP() /******************************************************************************/ // CTfont construction/destruction CTfont::CTfont( CTedit *pcTedit ) { ASSERT( pcTedit != NULL ); m_pcTedit = pcTedit; m_cStrTypeFaceName.Empty(); m_cStrTypeFaceNamePrev.Empty(); m_nCharSet = DEFAULT_CHARSET; m_nCharSetPrev = DEFAULT_CHARSET; m_iWeight = FW_NORMAL; m_bBoldOn = FALSE; m_bItalicOn = FALSE; m_bUnderlineOn = FALSE; m_bVertEditOn = FALSE; m_bShadowOn = FALSE; m_bPenOn = FALSE; m_bInUpdate = FALSE; m_iControlIDLastChange = 0; m_iPointSize = 0; m_iPointSizePrev = 0; m_iFontType = 0; m_cRectWindow.SetRectEmpty(); m_pcTfontTbar = new CTfontTbar(); } /******************************************************************************/ CTfont::CTfont() { m_cStrTypeFaceName.Empty(); m_cStrTypeFaceNamePrev.Empty(); m_nCharSet = DEFAULT_CHARSET; m_nCharSetPrev = DEFAULT_CHARSET; m_iWeight = FW_NORMAL; m_bBoldOn = FALSE; m_bItalicOn = FALSE; m_bUnderlineOn = FALSE; m_bVertEditOn = FALSE; m_bShadowOn = FALSE; m_bPenOn = FALSE; m_bInUpdate = FALSE; m_iControlIDLastChange = 0; m_iPointSize = 0; m_iPointSizePrev = 0; m_iFontType = 0; m_cRectWindow.SetRectEmpty(); m_pcTfontTbar = new CTfontTbar(); } /******************************************************************************/ // CTfont construction/destruction CTfont::~CTfont(void) { SaveToIniFile(); // *DK* this deletion of the current font assumes this object, the font picker, // is going away at the same time the edit control is going away, since this // current font is selected into the edit control. m_cCurrentFont.DeleteObject(); if (m_pcTedit) { m_pcTedit->m_pcTfont = NULL; m_pcTedit = NULL; } delete m_pcTfontTbar; } /******************************************************************************/ BOOL CTfont::Create( CRect rectEditArea ) { BOOL bRC = TRUE; CRect cRectWindow( 0, 0, 0, 0 ); CString pWindowName; pWindowName.LoadString( IDS_FONT_TOOL); bRC = CMiniFrmWnd::Create( pWindowName, 0, cRectWindow, AfxGetMainWnd() ); if (bRC != FALSE) { TRY { bRC = m_cTfontDlg.Create ( this ); // can throw excpetion bRC = m_pcTfontTbar->Create( this ); // can throw excpetion ResizeWindow(); } CATCH(CResourceException, e) { /*DK* ##ERROR CResourceException caught, could not create either toolbar or dialog bar object */ } END_CATCH } else { /*DK* ##ERROR Could not create window for font tool box*/ } ASSERT( bRC != FALSE ); if (bRC != FALSE) { RefreshFontList(); //Select the first item in the combobox. CComboBox* pCBox = (CComboBox*)m_cTfontDlg.GetDlgItem( IDC_TYPEFACE ); ASSERT( pCBox != NULL ); if (pCBox != NULL) { // we need to default to font with correct charset or font association. CHARSETINFO csi; if (!TranslateCharsetInfo((DWORD*)UIntToPtr(GetACP()), &csi, TCI_SRCCODEPAGE)) csi.ciCharset=ANSI_CHARSET; for (int bFound = FALSE, index=0; !bFound && index < pCBox->GetCount();index++) { CFontDesc* pDesc = (CFontDesc*) pCBox->GetItemData(index); for (CCharSetDesc *pCharSetDesc = &pDesc->m_CharSetDesc; !bFound && pCharSetDesc != NULL; pCharSetDesc = pCharSetDesc->m_pNext) { if ( pCharSetDesc->m_nCharSet == csi.ciCharset) { bFound = TRUE; pCBox->SetCurSel(index); g_CharSetHistoryList.AddHead(pCharSetDesc->m_nCharSet); } } } // simulate a selection OnTypefaceChange(); } ReadFromIniFile(); // will show the window the same state as saved // make sure the font tools does not show up on top of the edit box CRect rectFont; CRect rect; GetWindowRect( &rectFont ); if (rect.IntersectRect( &rectEditArea, &rectFont )) SetWindowPos( &wndTop, rectFont.left, rectEditArea.top - (rectFont.Height() + theApp.m_cyFrame), 0, 0, SWP_NOSIZE ); if (theApp.m_bShowTextToolbar) ShowWindow( SW_SHOWNOACTIVATE ); } return bRC; } /***************************************************************************/ BOOL CTfont::PreCreateWindow(CREATESTRUCT& cs) { BOOL bRet = CMiniFrmWnd::PreCreateWindow(cs); if (bRet) { // We don't want CLIENTEDGE on this window cs.dwExStyle &= ~WS_EX_CLIENTEDGE; } return(bRet); } /******************************************************************************/ void CTfont::GetFontInfo(int iFontSelection, BYTE nCharSetSelection) { CFontComboBox* pFontCBox = (CFontComboBox*)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); CCharSetComboBox* pCharSetCBox = (CCharSetComboBox*)m_cTfontDlg.GetDlgItem(IDC_CHARSET); CFontDesc* pDesc = pFontCBox->GetFontDesc(iFontSelection); m_strFontName = pDesc->m_strName; m_iFontType = pDesc->m_iFontType; // set the charset m_nCharSetPrev = m_nCharSet; m_nCharSet = nCharSetSelection; // fill in the charset combo box with the current set of charsets pCharSetCBox->ResetContent(); for (CCharSetDesc *pCharSetDesc = &pDesc->m_CharSetDesc; pCharSetDesc != NULL; pCharSetDesc = pCharSetDesc->m_pNext) { pCharSetCBox->AddCharSet(pCharSetDesc->m_strScript, pCharSetDesc->m_nCharSet); } // and select the current charset pCharSetCBox->SelectCharSet(-1, nCharSetSelection); } void CTfont::Undo(void) { switch( m_iControlIDLastChange ) { case IDC_TYPEFACE: if (m_cStrTypeFaceName.Compare(m_cStrTypeFaceNamePrev) != 0) { TRY { CString cStrTemp = m_cStrTypeFaceName; m_cStrTypeFaceName = m_cStrTypeFaceNamePrev; m_cStrTypeFaceNamePrev = cStrTemp; CFontComboBox* pCBox = (CFontComboBox*)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); int iSelection = pCBox->SelectString( -1, m_cStrTypeFaceName ); ASSERT( iSelection != CB_ERR ); if (iSelection != CB_ERR) { GetFontInfo(iSelection, m_nCharSetPrev); ProcessNewTypeface(); } } CATCH(CMemoryException,e) { /*DK* ##ERROR CString Thrown CMemoryException*/ } END_CATCH } // the processing of process new font may cause a re-selection in the // combo box (same code as user selection) changing this value. We // must re-set for undo of undo. m_iControlIDLastChange = IDC_TYPEFACE; break; case IDC_POINTSIZE: if (m_iPointSize != m_iPointSizePrev) { int iPointSizeTemp = m_iPointSize; m_iPointSize = m_iPointSizePrev; m_iPointSizePrev = iPointSizeTemp; m_cTfontDlg.SetDlgItemInt( IDC_POINTSIZE, m_iPointSize ); UpdateEditControlFont(); } break; case IDC_BOLD: OnBold(); RefreshToolBar(); break; case IDC_ITALIC: OnItalic(); RefreshToolBar(); break; case IDC_UNDERLINE: OnUnderline(); RefreshToolBar(); break; case IDC_VERTEDIT: OnVertEdit(); RefreshToolBar(); break; case IDC_SHADOW: OnShadow(); RefreshToolBar(); break; default: break; } } /******************************************************************************/ void CTfont::RefreshToolBar(void) { // Set the bold button state if (m_bBoldOn) { m_pcTfontTbar->SetButtonInfo( BOLD_TBAR_POS, IDC_BOLD, TBBS_CHECKBOX | TBBS_CHECKED, BOLD_BMP_POS); } else { m_pcTfontTbar->SetButtonInfo( BOLD_TBAR_POS, IDC_BOLD, TBBS_CHECKBOX, BOLD_BMP_POS); } // Set the italic button state if (m_bItalicOn) { m_pcTfontTbar->SetButtonInfo( ITALIC_TBAR_POS, IDC_ITALIC, TBBS_CHECKBOX | TBBS_CHECKED, ITALIC_BMP_POS); } else { m_pcTfontTbar->SetButtonInfo( ITALIC_TBAR_POS, IDC_ITALIC, TBBS_CHECKBOX, ITALIC_BMP_POS); } // Set the underline button state if (m_bUnderlineOn) { m_pcTfontTbar->SetButtonInfo(UNDERLINE_TBAR_POS, IDC_UNDERLINE, TBBS_CHECKBOX | TBBS_CHECKED, UNDERLINE_BMP_POS); } else { m_pcTfontTbar->SetButtonInfo(UNDERLINE_TBAR_POS, IDC_UNDERLINE, TBBS_CHECKBOX, UNDERLINE_BMP_POS); } // Set the VertEdit button state if (m_bVertEditOn) { m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX | TBBS_CHECKED, VERTEDIT_BMP_POS); } else { m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX, VERTEDIT_BMP_POS); } // Set the underline button state if (theApp.m_bPenSystem) if (m_bPenOn) { m_pcTfontTbar->SetButtonInfo(PEN_TBAR_PEN_POS, IDC_PENEXT, TBBS_CHECKBOX | TBBS_CHECKED, PEN_BMP_POS); } else { m_pcTfontTbar->SetButtonInfo(PEN_TBAR_TEXT_POS, IDC_PENEXT, TBBS_CHECKBOX, PEN_BMP_POS); } // Set the shadow button state // currently this is not present on the toolbar. When it is available, fix the // SHADOW_TBAR_POS and SHADOW_BMP_POS #define in tfont.h // if (m_bShadowOn) // { // m_pcTfontTbar->SetButtonInfo(SHADOW_TBAR_POS, IDC_SHADOW, TBBS_CHECKBOX | TBBS_CHECKED, SHADOW_BMP_POS); // } // else // { // m_pcTfontTbar->SetButtonInfo(SHADOW_TBAR_POS, IDC_SHADOW, TBBS_CHECKBOX, SHADOW_BMP_POS); // } } /******************************************************************************/ void CTfont::ResizeWindow( void ) { CRect cClientRect; CRect cRectDlgBar; CRect cRectTbar; int ixPosDlgBar = 0; int iyPosDlgBar = 0; int ixPosTbar = 0; int iyPosTbar = 0; int iWindowHeight = 0; int iWindowWidth = 0; int iBorder = 0; int ixNCBorder = 0; int iyNCBorder = 0; ixNCBorder += theApp.m_cxBorder * 2; iyNCBorder += theApp.m_cyBorder * 2; iyNCBorder += theApp.m_cyCaption; m_cTfontDlg.GetWindowRect( &cRectDlgBar ); cRectTbar.SetRectEmpty(); m_pcTfontTbar->GetWindowRect( &cRectTbar ); // /4 since border is for top/bottom or left/right // the boder is 1/4 the height of the tool/dialog bar iBorder += cRectDlgBar.Height() / 4; // Compute the Width // Width is combination of both iWindowWidth += ixNCBorder; iWindowWidth += cRectDlgBar.Width(); iWindowWidth += cRectTbar.Width(); iWindowWidth += 3 * iBorder; // border on left and right and between dlgbar and tbar // Compute the Height // Height is combination of both iWindowHeight += iyNCBorder; iWindowHeight += cRectDlgBar.Height(); iWindowHeight += 2 * iBorder; // border on top and bottom // position the main window if (GetSafeHwnd() != NULL) { // size this window to fit children SetWindowPos(&wndTop, 0, 0, iWindowWidth, iWindowHeight, SWP_NOMOVE); } GetClientRect(&cClientRect); // calculate the x positions of the 2 control bars (next to eachother) ixPosDlgBar = iBorder; ixPosTbar = iBorder * 2 + cRectDlgBar.Width(); // center the 2 control bars in the vertical position iyPosDlgBar = (cClientRect.Height() - cRectDlgBar.Height()) / 2; iyPosTbar = (cClientRect.Height() - cRectTbar.Height()) / 2; // Position the Dialog Bar if (m_cTfontDlg.GetSafeHwnd() != NULL) { m_cTfontDlg.SetWindowPos(&wndTop, ixPosDlgBar, iyPosDlgBar, 0, 0, SWP_NOSIZE); m_cTfontDlg.ShowWindow(SW_SHOWNOACTIVATE); } // Position the Toolbar if (m_pcTfontTbar->GetSafeHwnd() != NULL) { m_pcTfontTbar->SetWindowPos(&wndTop, ixPosTbar, iyPosTbar, 0, 0, SWP_NOSIZE); m_pcTfontTbar->ShowWindow(SW_SHOWNOACTIVATE); } } /******************************************************************************/ /******************************************************************************/ /* */ /* Ini File section format PBrush.INI in Windows Dir */ /* [Text] */ /* TypeFaceName= string */ /* PointSize= # */ /* FontPalette= x y nCmdShow (x,y) is location screen. nCmdShow is param to */ /* Bold= ON F ShowWindow of SW_SHOW or SW_HIDE */ /* Italic= ON */ /* Underline= ON */ /* */ /******************************************************************************/ void CTfont::SaveToIniFile(void) { theApp.m_iPointSize = m_iPointSize; theApp.m_strTypeFaceName = m_cStrTypeFaceName; theApp.m_iCharSet = m_nCharSet; theApp.m_iPosTextX = m_cRectWindow.left; theApp.m_iPosTextY = m_cRectWindow.top; theApp.m_iBoldText = m_bBoldOn; theApp.m_iItalicText = m_bItalicOn; theApp.m_iUnderlineText = m_bUnderlineOn; theApp.m_iVertEditText = m_bVertEditOn; theApp.m_iPenText = m_bPenOn; } /******************************************************************************/ /* See Save to ini for format of ini file */ void CTfont::ReadFromIniFile(void) { CRect rect; GetWindowRect( &rect ); CSize size = rect.Size(); CPoint ptPos = theApp.CheckWindowPosition( CPoint( theApp.m_iPosTextX, theApp.m_iPosTextY ), size ); if (! ptPos.x && ! ptPos.y) { AfxGetMainWnd()->GetWindowRect( &rect ); rect.OffsetRect( 15, 15 ); ptPos.x = rect.left; ptPos.y = rect.top; } if (GetSafeHwnd() != NULL) { SetWindowPos(&wndTop, ptPos.x, ptPos.y, 0, 0, SWP_NOSIZE); } if (theApp.m_strTypeFaceName.IsEmpty() == 0) { m_cStrTypeFaceName = theApp.m_strTypeFaceName; m_iPointSize = theApp.m_iPointSize; // m_iPointSize = 0; // 0 is initial value => 1st in list will be selected CFontComboBox* pCBox = (CFontComboBox*)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); int iSelection = pCBox->SelectString(-1, m_cStrTypeFaceName); if (iSelection != CB_ERR) { CFontDesc* pDesc = pCBox->GetFontDesc(iSelection); BYTE nNewCharSet = PickCharSet(&pDesc->m_CharSetDesc, theApp.m_iCharSet); GetFontInfo(iSelection, nNewCharSet); ProcessNewTypeface(); // this will also set the pointsize to what we have in our variable } } if (theApp.m_iBoldText) { m_bBoldOn = FALSE; OnBold(); // toggles from false to TRUE m_pcTfontTbar->SetButtonInfo(BOLD_TBAR_POS, IDC_BOLD, TBBS_CHECKBOX | TBBS_CHECKED, BOLD_BMP_POS); } if (theApp.m_iItalicText) { m_bItalicOn = FALSE; OnItalic(); // toggles from false to TRUE m_pcTfontTbar->SetButtonInfo(ITALIC_TBAR_POS, IDC_ITALIC, TBBS_CHECKBOX | TBBS_CHECKED, ITALIC_BMP_POS); } if (theApp.m_iUnderlineText) { m_bUnderlineOn = FALSE; OnUnderline(); // toggles from false to TRUE m_pcTfontTbar->SetButtonInfo(UNDERLINE_TBAR_POS, IDC_UNDERLINE, TBBS_CHECKBOX | TBBS_CHECKED, UNDERLINE_BMP_POS); } if (theApp.m_iVertEditText == -1) //no setting in profile { theApp.m_iVertEditText = (IS_DBCS_CHARSET(m_nCharSet)) ? FALSE : 2; } if (theApp.m_iVertEditText == 2) { m_bVertEditOn = 2; m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX | TBBS_DISABLED, VERTEDIT_BMP_POS); } else if (theApp.m_iVertEditText) { m_bVertEditOn = FALSE; OnVertEdit(); // toggles from false to TRUE m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX | TBBS_CHECKED, VERTEDIT_BMP_POS); } else { m_bVertEditOn = FALSE; m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX, VERTEDIT_BMP_POS); } if (theApp.m_bPenSystem) if (theApp.m_iPenText) { m_bPenOn = FALSE; OnPen(); // toggles from false to TRUE } } /******************************************************************************/ void CTfont::RefreshFontList(void) { CFontComboBox* pBox = (CFontComboBox *)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); pBox->ClearList(); CClientDC cdcWindow(this); HDC hDC = cdcWindow.GetSafeHdc(); ASSERT(hDC != NULL); if (hDC != NULL) { FONTENUMPROC lpEnumFamCallBack; lpEnumFamCallBack = (FONTENUMPROC) CTfont::EnumFontFaceProc; LOGFONT lf; memset(&lf, 0, sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET; ::EnumFontFamiliesEx(hDC, &lf, lpEnumFamCallBack, (LPARAM) this, NULL); } } /******************************************************************************/ int CFontComboBox::AddFontName(LPCTSTR lpszName, LPCTSTR lpszScript, BYTE nCharSet, int iFontType) { int nIndex = FindStringExact(-1, lpszName); if (nIndex != CB_ERR) { // add this new charset to the end of the charset list CFontDesc* pDesc = (CFontDesc*) GetItemData(nIndex); CCharSetDesc *pCharSetDesc = &pDesc->m_CharSetDesc; while (pCharSetDesc->m_pNext != NULL) { pCharSetDesc = pCharSetDesc->m_pNext; } pCharSetDesc->m_pNext = new CCharSetDesc(lpszScript, nCharSet); return(nIndex); } CFontDesc* pDesc = new CFontDesc(lpszName, lpszScript, nCharSet, iFontType); if (!pDesc) { return(-1); } nIndex = AddString(lpszName); ASSERT(nIndex >=0); if (nIndex >=0) //no error { SetItemData(nIndex, (DWORD_PTR)pDesc); } else { delete pDesc; } return nIndex; } void CFontComboBox::ClearList() { // destroy all the CFontDesc's int nCount = GetCount(); for (int i=0;im_strName, pDescOther->m_strName) == 0); } int CCharSetComboBox::AddCharSet(LPCTSTR lpszScript, BYTE nCharSet) { int nIndex = AddString(lpszScript); if (nIndex != CB_ERR && nIndex != CB_ERRSPACE) { SetItemData(nIndex, nCharSet); } return nIndex; } int CCharSetComboBox::SelectCharSet(int nStartAfter, BYTE nCharSet) { for (int i = nStartAfter+1; i < GetCount(); ++i) { if ((BYTE) GetItemData(i) == nCharSet) { return SetCurSel(i); } } return CB_ERR; } int CCharSetComboBox::GetCurSelCharSet() { int iSelection = GetCurSel(); if (iSelection != CB_ERR) { iSelection = (int) GetItemData(iSelection); } return iSelection; } int CTfont::EnumFontFace( ENUMLOGFONTEX* lpEnumLogFont, NEWTEXTMETRICEX* lpNewTextMetric, int iFontType ) { // only enumerate TrueType faces // in DBCS builds also exclude vertical faces if ((lpEnumLogFont->elfLogFont.lfCharSet != OEM_CHARSET) && (lpEnumLogFont->elfLogFont.lfCharSet != MAC_CHARSET) && (lpEnumLogFont->elfLogFont.lfFaceName[0] != TEXT('@')) ) { INT ntmFlags = lpNewTextMetric->ntmTm.ntmFlags; CFontComboBox* pBox = (CFontComboBox *)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); if (ntmFlags & NTM_PS_OPENTYPE) iFontType = PS_OPENTYPE_FONT; else if (ntmFlags & NTM_TYPE1) iFontType = TYPE1_FONT; else { if (iFontType & TRUETYPE_FONTTYPE) { if (ntmFlags & NTM_TT_OPENTYPE) iFontType = TT_OPENTYPE_FONT; else iFontType = TT_FONT; } else if (iFontType & DEVICE_FONTTYPE) iFontType = DEVICE_FONT; else if (iFontType & RASTER_FONTTYPE) iFontType = RASTER_FONT; } pBox->AddFontName(lpEnumLogFont->elfLogFont.lfFaceName, (LPCTSTR)lpEnumLogFont->elfScript, lpEnumLogFont->elfLogFont.lfCharSet, iFontType); } return 1; } /******************************************************************************/ int CALLBACK CTfont::EnumFontFaceProc( ENUMLOGFONTEX* lpEnumLogFont, NEWTEXTMETRICEX* lpNewTextMetric, int iFontType, LPARAM lParam ) { class CTfont* pCTfont; ASSERT(lParam != NULL); if (lParam != NULL) { pCTfont = (CTfont*)lParam; return pCTfont->EnumFontFace(lpEnumLogFont, lpNewTextMetric, iFontType); } return 0; } /******************************************************************************/ int CTfont::EnumFontSizes( LPENUMLOGFONT lpEnumLogFont, LPNEWTEXTMETRIC lpNewTextMetric, int iFontType ) { int iPtSize; /* testint */ CAttrEdit* pcEdit = m_pcTedit->GetEditWindow(); ASSERT(pcEdit != NULL); if (pcEdit != NULL) { CClientDC cdcClient( pcEdit ); // ptsize = char height * 72 / pixels per inch // char height = cell height - internal leading iPtSize = MulDiv( lpNewTextMetric->tmHeight - lpNewTextMetric->tmInternalLeading, 72, cdcClient.GetDeviceCaps( LOGPIXELSY ) ); } TCHAR buffTmp[10]; // Leading zero prefixed for Combobox sorting order. wsprintf( buffTmp, TEXT("%2d"), iPtSize ); CComboBox* pCBox = (CComboBox*)m_cTfontDlg.GetDlgItem(IDC_POINTSIZE); ASSERT (pCBox != NULL); if (pCBox != NULL) { // only add the string if it does not exist int iRC = pCBox->FindStringExact(-1, buffTmp); if (iRC == CB_ERR) { pCBox->AddString(buffTmp); } } return 1; } /******************************************************************************/ int CALLBACK CTfont::EnumFontOneFaceProc( LPENUMLOGFONT lpEnumLogFont, LPNEWTEXTMETRIC lpNewTextMetric, int iFontType, LPARAM lParam ) { class CTfont* pCTfont; ASSERT(lParam != NULL); if (lParam != NULL) { pCTfont = (CTfont*)lParam; return pCTfont->EnumFontSizes(lpEnumLogFont, lpNewTextMetric, iFontType); } return 0; } /******************************************************************************/ // User selected a new typeface in the combo box /******************************************************************************/ void CTfont::ProcessNewTypeface(void) { CString cStringText; CClientDC cdcDlgBox( this ); HDC hDC = cdcDlgBox.GetSafeHdc(); ASSERT(hDC != NULL); if (hDC != NULL) { FONTENUMPROC lpEnumFamCallBack; lpEnumFamCallBack = (FONTENUMPROC)CTfont::EnumFontOneFaceProc; CComboBox* pCBox = (CComboBox*)m_cTfontDlg.GetDlgItem(IDC_POINTSIZE); ASSERT (pCBox != NULL); if (pCBox != NULL) { pCBox->ResetContent(); // only do this if non-true-type font if true type, filll in with default sizes if ( (m_iFontType & (TT_FONT | TT_OPENTYPE_FONT)) || !( (m_iFontType & (TT_FONT | TT_OPENTYPE_FONT)) || (m_iFontType & RASTER_FONT) ) ) // if truetype or vector font { // True Type and Vector Fonts are continuously scallable. // There are the reccomended values pCBox->AddString(TEXT(" 8")); pCBox->AddString(TEXT(" 9")); pCBox->AddString(TEXT("10")); pCBox->AddString(TEXT("11")); pCBox->AddString(TEXT("12")); pCBox->AddString(TEXT("14")); pCBox->AddString(TEXT("16")); pCBox->AddString(TEXT("18")); pCBox->AddString(TEXT("20")); pCBox->AddString(TEXT("22")); pCBox->AddString(TEXT("24")); pCBox->AddString(TEXT("26")); pCBox->AddString(TEXT("28")); pCBox->AddString(TEXT("36")); pCBox->AddString(TEXT("48")); pCBox->AddString(TEXT("72")); } else { ::EnumFontFamilies(hDC, m_strFontName, lpEnumFamCallBack, (LPARAM) this); } // 0 is uninitialized value if (m_iPointSize != 0) { m_cTfontDlg.SetDlgItemInt(IDC_POINTSIZE, m_iPointSize); } else { pCBox->SetCurSel(0); } // simulate a selection OnPointSizeComboBoxUpdate(); } } } /******************************************************************************/ // change the font in the edit control based on the font selection /******************************************************************************/ void CTfont::UpdateEditControlFont(void) { LOGFONT lf; CFont* pcOldFont; BOOL bRC; HFONT hFont; int iCellHeight = 0; BeginWaitCursor(); CAttrEdit* pcEdit = m_pcTedit->GetEditWindow(); ASSERT(pcEdit != NULL); if (pcEdit != NULL) { CClientDC cdcClient( pcEdit ); //previous font's tm.tmInternalLeading could be different from current. iCellHeight = - MulDiv(m_iPointSize, cdcClient.GetDeviceCaps(LOGPIXELSY) ,72); } lf.lfWidth = 0; lf.lfHeight = iCellHeight; lf.lfEscapement = (m_bVertEditOn == TRUE) ? 2700 : 0; lf.lfOrientation = (m_bVertEditOn == TRUE) ? 2700 : 0; lf.lfWeight = m_iWeight; lf.lfItalic = (BYTE)m_bItalicOn; lf.lfUnderline = (BYTE)m_bUnderlineOn; lf.lfStrikeOut = 0; lf.lfCharSet = m_nCharSet; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = FF_DONTCARE | DEFAULT_PITCH; if ( (m_bVertEditOn == TRUE) && IS_DBCS_CHARSET( lf.lfCharSet ) ) { lstrcpy(lf.lfFaceName, TEXT("@")); lstrcpyn(lf.lfFaceName + 1, m_strFontName, ARRAYSIZE(lf.lfFaceName) - 1); } else lstrcpyn(lf.lfFaceName, m_strFontName, ARRAYSIZE(lf.lfFaceName)); hFont = (HFONT)m_cCurrentFont.Detach(); bRC = m_cCurrentFont.CreateFontIndirect(&lf); ASSERT(bRC != 0); if (bRC != 0) { if (m_pcTedit != NULL) { CAttrEdit* pcEdit = m_pcTedit->GetEditWindow(); ASSERT( pcEdit != NULL ); pcOldFont = pcEdit->GetFont(); pcEdit->SetFont( &m_cCurrentFont ); m_pcTedit->OnAttrEditFontChange(); m_pcTedit->RefreshWindow(); } //hFont is last font allocated here if (hFont != NULL) { ::DeleteObject( hFont ); } } else { /*DK* ##ERROR Could not create font indirect */ } EndWaitCursor(); } /******************************************************************************/ /******************************************************************************/ BYTE CTfont::PickCharSet(CCharSetDesc *pCharSetDescList, int iCharSetSelection) { ASSERT(pCharSetDescList); // place the selected charset on top of the charset history list if (iCharSetSelection != g_CharSetHistoryList.GetAt(0) && iCharSetSelection != -1) { g_CharSetHistoryList.AddHead(iCharSetSelection); } // try to select a charset from the history list for (unsigned int i = 0; i < g_CharSetHistoryList.m_uHistorySize; ++i) { int nSearchCharSet = g_CharSetHistoryList.GetAt(i); if (nSearchCharSet != -1) { for (CCharSetDesc *pCharSetDesc = pCharSetDescList; pCharSetDesc != NULL; pCharSetDesc = pCharSetDesc->m_pNext) { if (pCharSetDesc->m_nCharSet == (BYTE) nSearchCharSet) { return (BYTE) nSearchCharSet; } } } } // if we fail to find a match, select the first charset return pCharSetDescList->m_nCharSet; } /******************************************************************************/ // Combo box for type face changed, determine what processing to do /******************************************************************************/ void CTfont::OnTypeFaceComboBoxUpdate(void) { int iSelection; CString cStringText; // LPFONTINFORMATION lpFontInformation; CFontComboBox* pFontCBox = (CFontComboBox*)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); CCharSetComboBox* pCharSetCBox = (CCharSetComboBox*)m_cTfontDlg.GetDlgItem(IDC_CHARSET); ASSERT(pFontCBox != NULL && pCharSetCBox != NULL); if (pFontCBox != NULL && pCharSetCBox != NULL) { TRY { iSelection = pFontCBox->GetCurSel(); ASSERT(iSelection != CB_ERR); if (iSelection != CB_ERR) { pFontCBox->GetLBText(iSelection, cStringText); } } CATCH(CMemoryException,e) { cStringText.Empty(); /*DK* ##ERROR CString Thrown CMemoryException*/ } END_CATCH int iCharSetSelection = pCharSetCBox->GetCurSelCharSet(); if (m_cStrTypeFaceName.Compare(cStringText) != 0 || (BYTE) iCharSetSelection != m_nCharSet) { CFontDesc* pDesc = pFontCBox->GetFontDesc(iSelection); BYTE nNewCharSet = PickCharSet(&pDesc->m_CharSetDesc, iCharSetSelection); if ( IS_DBCS_CHARSET( nNewCharSet ) ) { if ( m_bVertEditOn == 2 ) { m_bVertEditOn = FALSE; m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX, VERTEDIT_BMP_POS); } } else { if ( m_bVertEditOn == TRUE ) { AfxMessageBox(IDS_ERROR_DBCSFONTONLY); pFontCBox->SelectString( -1, m_cStrTypeFaceName ); pCharSetCBox->SelectCharSet( -1, m_nCharSet ); return; } else { m_bVertEditOn = 2; m_pcTfontTbar->SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX | TBBS_DISABLED, VERTEDIT_BMP_POS); } } // could have been set in OnCloseUpTypeFace method, so don't do double // processing TRY { m_cStrTypeFaceNamePrev = m_cStrTypeFaceName; m_cStrTypeFaceName = cStringText; } CATCH(CMemoryException,e) { m_cStrTypeFaceName.Empty(); /*DK* ##ERROR CString Thrown CMemoryException*/ } END_CATCH GetFontInfo(iSelection, nNewCharSet); ProcessNewTypeface(); m_iControlIDLastChange = IDC_TYPEFACE; } } } /******************************************************************************/ void CTfont::OnPointSizeComboBoxUpdate(void) { int iSelection; int iHeight; CString cStringText; CComboBox* pCBox = (CComboBox*)m_cTfontDlg.GetDlgItem(IDC_POINTSIZE); ASSERT(pCBox != NULL); if (pCBox != NULL) { TRY { iSelection = pCBox->GetCurSel(); if (iSelection != CB_ERR) { pCBox->GetLBText(iSelection, cStringText); iHeight = Atoi(cStringText); } else { // if no selection, get displayed value in combo edit part iHeight = m_cTfontDlg.GetDlgItemInt(IDC_POINTSIZE); } } CATCH(CMemoryException,e) { cStringText.Empty(); /*DK* ##ERROR CString Thrown CMemoryException*/ } END_CATCH if (iHeight !=0 ) { if (iHeight != m_iPointSize ) { // could have been set in OnCloseUpTypeFace method, so don't do double // processing m_iPointSizePrev = m_iPointSize; m_iPointSize = iHeight; } } else { AfxMessageBox(IDS_ERROR_FONTSIZENUMERIC); m_cTfontDlg.SetDlgItemInt(IDC_POINTSIZE,m_iPointSize); } // need to call update font because could be same size with diff // typeface, and we got called indirectly by filling the combo box UpdateEditControlFont(); m_iControlIDLastChange = IDC_POINTSIZE; } } /******************************************************************************/ void CTfont::OnTypefaceChange() { if (! m_bInUpdate) { m_bInUpdate = TRUE; OnTypeFaceComboBoxUpdate(); m_bInUpdate = FALSE; } } /******************************************************************************/ void CTfont::OnPointSizeChange() { if (! m_bInUpdate) { m_bInUpdate = TRUE; OnPointSizeComboBoxUpdate(); m_bInUpdate = FALSE; } } /******************************************************************************/ void CTfont::OnRButtonDown(UINT nFlags, CPoint point) { #if 0 CMenu cMenuPopup; CMenu *pcContextMenu; BOOL bRC; bRC = cMenuPopup.LoadMenu(IDR_TEXT_POPUP); ASSERT(bRC != 0); if (bRC != 0) { pcContextMenu = cMenuPopup.GetSubMenu(ID_TOOL_POPUPMENU_POS); ASSERT(pcContextMenu != NULL); if (pcContextMenu != NULL) { ClientToScreen(&point); pcContextMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this, NULL); } } else { /*DK* ##ERROR Could not loadmenu */ } #endif } /******************************************************************************/ void CTfont::OnMove(int x, int y) { CMiniFrmWnd::OnMove(x, y); // TODO: Add your message handler code here GetWindowRect(&m_cRectWindow); } /******************************************************************************/ void CTfont::OnClose() { theApp.m_bShowTextToolbar = FALSE; ShowWindow( SW_HIDE ); } /******************************************************************************/ BOOL CTfont::OnEraseBkgnd( CDC* pDC ) { CRect rect; GetClientRect( rect ); pDC->FillRect( rect, GetSysBrush( COLOR_BTNFACE ) ); return CMiniFrmWnd::OnEraseBkgnd( pDC ); } /******************************************************************************/ void CTfont::OnSetFocus(CWnd* pOldWnd) { CMiniFrmWnd::OnSetFocus(pOldWnd); CComboBox* pCBox = (CComboBox*)m_cTfontDlg.GetDlgItem( IDC_TYPEFACE ); ASSERT(pCBox != NULL); if (pCBox != NULL) { pCBox->SetFocus(); } } /******************************************************************************/ void CTfont::OnDestroy() { CFontComboBox* pBox = (CFontComboBox *)m_cTfontDlg.GetDlgItem(IDC_TYPEFACE); pBox->ClearList(); CMiniFrmWnd::OnDestroy(); } /******************************************************************************/ void CTfont::OnBold(void) { m_iControlIDLastChange = IDC_BOLD; m_bBoldOn = !m_bBoldOn; if (m_bBoldOn) { m_iWeight = FW_BOLD; } else { m_iWeight = FW_NORMAL; } UpdateEditControlFont(); } /******************************************************************************/ void CTfont::OnItalic(void) { m_bItalicOn = !m_bItalicOn; UpdateEditControlFont(); m_iControlIDLastChange = IDC_ITALIC; } /******************************************************************************/ void CTfont::OnUnderline(void) { m_bUnderlineOn = !m_bUnderlineOn; UpdateEditControlFont(); m_iControlIDLastChange = IDC_UNDERLINE; } /******************************************************************************/ void CTfont::OnVertEdit(void) { if (m_bVertEditOn == 2) { return; } m_bVertEditOn = !m_bVertEditOn; m_pcTedit->m_bVertEdit = m_bVertEditOn; UpdateEditControlFont(); m_iControlIDLastChange = IDC_VERTEDIT; } /******************************************************************************/ void CTfont::OnVertEditUpdate(CCmdUI* pCmdUI) { pCmdUI->Enable( !(m_bVertEditOn == 2) ); } /******************************************************************************/ void CTfont::OnShadow(void) { m_bShadowOn = !m_bShadowOn; UpdateEditControlFont(); m_iControlIDLastChange = IDC_SHADOW; } /******************************************************************************/ void CTfont::OnPen(void) { PostMessage( UM_DELAYED_TOOLBAR ); } /******************************************************************************/ long CTfont::OnDelayedPen( WPARAM, LPARAM ) { if (! theApp.m_bPenSystem) m_bPenOn = FALSE; m_bPenOn = !m_bPenOn; m_iControlIDLastChange = IDC_PENEXT; delete m_pcTfontTbar; m_pcTfontTbar = new CTfontTbar(); BOOL bRC = m_pcTfontTbar->Create( this, m_bPenOn ); if (bRC) { ResizeWindow(); RefreshToolBar(); } return 0; } /******************************************************************************/ void CTfont::OnEditText(void) { m_iControlIDLastChange = IDC_EDITTEXT; CEdit *ctl = m_pcTedit? m_pcTedit->GetEditWindow() : NULL; if (ctl) { ctl->SetFocus(); #ifndef NT // NT doesn't support pen computing ctl->SendMessage(WM_PENMISC, PMSC_EDITTEXT, 0); #endif } } /******************************************************************************/ void CTfont::OnKeyboard(void) { m_iControlIDLastChange = IDC_KEYBOARD; CEdit *ctl = m_pcTedit? m_pcTedit->GetEditWindow() : NULL; if (ctl) { } } /******************************************************************************/ void CTfont::OnInsSpace(void) { m_iControlIDLastChange = IDC_INS_SPACE; CEdit *ctl = m_pcTedit? m_pcTedit->GetEditWindow() : NULL; if (ctl) { ctl->SendMessage(WM_CHAR, (WPARAM)VK_SPACE, 0); ctl->SetFocus(); } } /******************************************************************************/ void CTfont::OnBackSpace(void) { m_iControlIDLastChange = IDC_BACKSPACE; CEdit *ctl = m_pcTedit? m_pcTedit->GetEditWindow() : NULL; if (ctl) { ctl->SendMessage(WM_CHAR, (WPARAM)VK_BACK, 0); ctl->SetFocus(); } } /******************************************************************************/ void CTfont::OnNewLine(void) { m_iControlIDLastChange = IDC_NEWLINE; CEdit *ctl = m_pcTedit? m_pcTedit->GetEditWindow() : NULL; if (ctl) { ctl->SendMessage(WM_CHAR, (WPARAM)VK_RETURN, 0); ctl->SetFocus(); } } /******************************************************************************/ void CTfontDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { CString cStringText; CComboBox cCBox; BOOL bRC; TRY { ASSERT( lpDrawItemStruct->CtlType == ODT_COMBOBOX ); ASSERT( lpDrawItemStruct->CtlID == IDC_TYPEFACE ); if (lpDrawItemStruct->CtlType != ODT_COMBOBOX || lpDrawItemStruct->CtlID != IDC_TYPEFACE) { AfxThrowNotSupportedException(); } // empty combo boxes have -1 id if (lpDrawItemStruct->itemID != 0xFFFFFFFF) { bRC = cCBox.Attach(lpDrawItemStruct->hwndItem); ASSERT(bRC != 0); if (bRC == 0) { AfxThrowNotSupportedException(); } TRY { cCBox.GetLBText(lpDrawItemStruct->itemID, cStringText); cCBox.Detach(); DrawItem(lpDrawItemStruct, &cStringText); } CATCH(CMemoryException,e) { cStringText.Empty(); cCBox.Detach(); /*DK* ##ERROR CString Thrown CMemoryException*/ } END_CATCH } } CATCH(CNotSupportedException,e) { CWnd::OnDrawItem(nIDCtl, lpDrawItemStruct); } END_CATCH } /******************************************************************************/ void CTfont::OnLButtonDown(UINT nFlags, CPoint point) { CMiniFrmWnd::OnLButtonDown(nFlags, point); } /******************************************************************************/ void CTfont::OnLButtonUp(UINT nFlags, CPoint point) { CMiniFrmWnd::OnLButtonUp( nFlags, point ); } /******************************************************************************/ void CTfont::RecalcLayout(BOOL bNotify /*= TRUE*/) { if (m_pcTfontTbar && m_pcTfontTbar->m_hWnd && m_cTfontDlg.m_hWnd) { ResizeWindow(); } } /******************************************************************************/ /******************************************************************************/ /******************************************************************************/ // CTfontTbar BEGIN_MESSAGE_MAP( CTfontTbar, CToolBar ) //{{AFX_MSG_MAP(CTfontTbar) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! // ON_COMMAND(ID_OLE_INSERT_NEW, OnInsertObject) //}}AFX_MSG_MAP END_MESSAGE_MAP() /******************************************************************************/ // CTfontTbar construction/destruction CTfontTbar::CTfontTbar(void) { } /******************************************************************************/ BOOL CTfontTbar::Create(CWnd* pcParentWnd, BOOL bShowPen) { BOOL bRC = TRUE; int iNumButtons; int iNumSeparators; UINT ButtonIDS[MAX_TBAR_ITEMS]; if (bShowPen) { ButtonIDS[0] = IDC_BOLD; ButtonIDS[1] = IDC_ITALIC; ButtonIDS[2] = IDC_UNDERLINE; ButtonIDS[3] = IDC_VERTEDIT; ButtonIDS[4] = ID_SEPARATOR; ButtonIDS[5] = IDC_INS_SPACE; ButtonIDS[6] = IDC_BACKSPACE; ButtonIDS[7] = IDC_NEWLINE; ButtonIDS[8] = ID_SEPARATOR; ButtonIDS[9] = IDC_EDITTEXT; ButtonIDS[10] = ID_SEPARATOR; ButtonIDS[11] = IDC_PENEXT; iNumButtons = 12; iNumSeparators = 3; } else { ButtonIDS[0] = IDC_BOLD; ButtonIDS[1] = IDC_ITALIC; ButtonIDS[2] = IDC_UNDERLINE; ButtonIDS[3] = IDC_VERTEDIT; if (theApp.m_bPenSystem) { ButtonIDS[4] = ID_SEPARATOR; ButtonIDS[5] = IDC_PENEXT; iNumButtons = 6; iNumSeparators = 1; } else { iNumButtons = 4; iNumSeparators = 0; } } bRC = CToolBar::Create( pcParentWnd, CBRS_ALIGN_TOP ); if (bRC == 0) { AfxThrowResourceException(); /*DK* ##ERROR Could not create toolbar object*/ } bRC = LoadBitmap(IDB_TEXT_TBAR); if (bRC == 0) { AfxThrowResourceException(); /*DK* ##ERROR Could not load bitmap for toolbar*/ } bRC = SetButtons(ButtonIDS, iNumButtons); if (bShowPen) { // Set the style to be checkbox style. SetButtonInfo(BOLD_TBAR_POS, IDC_BOLD, TBBS_CHECKBOX, BOLD_BMP_POS); SetButtonInfo(ITALIC_TBAR_POS, IDC_ITALIC, TBBS_CHECKBOX, ITALIC_BMP_POS); SetButtonInfo(UNDERLINE_TBAR_POS, IDC_UNDERLINE, TBBS_CHECKBOX, UNDERLINE_BMP_POS); SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX, VERTEDIT_BMP_POS); SetButtonInfo(INS_SPACE_TBAR_POS, IDC_INS_SPACE, TBBS_BUTTON, INS_SPACE_BMP_POS); SetButtonInfo(BACKSPACE_TBAR_POS, IDC_BACKSPACE, TBBS_BUTTON, BACKSPACE_BMP_POS); SetButtonInfo(NEWLINE_TBAR_POS, IDC_NEWLINE, TBBS_BUTTON, NEWLINE_BMP_POS); SetButtonInfo(EDITTEXT_TBAR_POS, IDC_EDITTEXT, TBBS_BUTTON, EDITTEXT_BMP_POS); SetButtonInfo(PEN_TBAR_PEN_POS, IDC_PENEXT, TBBS_CHECKBOX, PEN_BMP_POS); // presently unused // SetButtonInfo(KEYBOARD_TBAR_POS, IDC_KEYBOARD, TBBS_BUTTON, KEYBOARD_BMP_POS); } else { // Set the style to be checkbox style. SetButtonInfo(BOLD_TBAR_POS, IDC_BOLD, TBBS_CHECKBOX, BOLD_BMP_POS); SetButtonInfo(ITALIC_TBAR_POS, IDC_ITALIC, TBBS_CHECKBOX, ITALIC_BMP_POS); SetButtonInfo(UNDERLINE_TBAR_POS, IDC_UNDERLINE, TBBS_CHECKBOX, UNDERLINE_BMP_POS); SetButtonInfo(VERTEDIT_TBAR_POS, IDC_VERTEDIT, TBBS_CHECKBOX, VERTEDIT_BMP_POS); if (theApp.m_bPenSystem) SetButtonInfo(PEN_TBAR_TEXT_POS, IDC_PENEXT, TBBS_CHECKBOX, PEN_BMP_POS); } CSize size = CToolBar::CalcFixedLayout( FALSE, TRUE ); if (GetSafeHwnd() != NULL) { SetWindowPos( &wndTop, 0, 0, size.cx, size.cy, SWP_NOMOVE ); } return bRC; } /******************************************************************************/ CTfontTbar::~CTfontTbar(void) { } /******************************************************************************/ /******************************************************************************/ // CTfontDlg BEGIN_MESSAGE_MAP(CTfontDlg, CDialogBar) //{{AFX_MSG_MAP(CTfontDlg) ON_WM_RBUTTONDOWN() ON_WM_MEASUREITEM() ON_WM_DRAWITEM() // ON_DM_GETDEFID() //}}AFX_MSG_MAP END_MESSAGE_MAP() /******************************************************************************/ // CTfontDlg construction/destruction CTfontDlg::CTfontDlg(void) { BOOL bRC; CSize cSizeBmp(0, 0); INT i; m_Max_cx_FontType_BMP = 0; // Set up the Size Structures for offsets in drawing the font typeface. for (i = 0; i < NumCPic; i++) { bRC = m_cPictures[i].PictureSet(CTBitmaps[i]); ASSERT( bRC != 0 ); if (bRC) { cSizeBmp = m_cPictures[i].PictureSize(); if (cSizeBmp.cx > m_Max_cx_FontType_BMP) { m_Max_cx_FontType_BMP = cSizeBmp.cx; } } else { /*DK* ##ERROR could not create bitmap for tt font in owner draw lbox*/ } } } /******************************************************************************/ BOOL CTfontDlg::Create(CWnd* pcParentWnd) { BOOL bRC = CDialogBar::Create(pcParentWnd, IDD_TEXT_FONT_DLG, CBRS_NOALIGN, NULL); if (bRC) SetWindowPos(&wndTop, 0,0, m_sizeDefault.cx, m_sizeDefault.cy, SWP_NOMOVE); return bRC; } /******************************************************************************/ CTfontDlg::~CTfontDlg(void) { } /******************************************************************************/ void CTfontDlg::OnRButtonDown(UINT nFlags, CPoint point) { CWnd *pcParent = GetParent(); const MSG *pCurrentMessage = GetCurrentMessage(); pcParent->SendMessage(pCurrentMessage->message, pCurrentMessage->wParam, pCurrentMessage->lParam); } /******************************************************************************/ void CTfontDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { TEXTMETRIC tm; BOOL bRC; // get default to fill in measureitem struct first CWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct); TRY { ASSERT( lpMeasureItemStruct->CtlType == ODT_COMBOBOX ); ASSERT( lpMeasureItemStruct->CtlID == IDC_TYPEFACE ); if (lpMeasureItemStruct->CtlType != ODT_COMBOBOX || lpMeasureItemStruct->CtlID != IDC_TYPEFACE) { AfxThrowNotSupportedException(); } CClientDC cdcClient(this); bRC = cdcClient.GetTextMetrics(&tm); ASSERT(bRC !=0); if (bRC != 0) { lpMeasureItemStruct->itemHeight = tm.tmAscent + 2; } } CATCH(CNotSupportedException,e) { } END_CATCH } /******************************************************************************/ void CTfontDlg::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct, CString *pcStringText) { CBrush* cpBrush; BOOL bSelected; BOOL bRC; CDC cdcCombo; BOOL bDrawPicture = FALSE; CRect cRectText; int iPictureHeight = 0; CSize cSizeBmp(0,0); int ix = 0; int iy = 0; CFontDesc* pDesc = (CFontDesc*)lpDrawItemStruct->itemData; CFontComboBox *pwndCombo = (CFontComboBox *)CFontComboBox::FromHandle(lpDrawItemStruct->hwndItem); if (pwndCombo) { // Only need to check the item before and after if (!pwndCombo->IsSameName(pDesc, lpDrawItemStruct->itemID - 1) && !pwndCombo->IsSameName(pDesc, lpDrawItemStruct->itemID + 1)) { pcStringText = &pDesc->m_strName; } } // Set the picture object up to draw a picture if one is needed (if this // font is a printer/true type font). bDrawPicture = TRUE; switch (pDesc->m_iFontType) { case DEVICE_FONT: cSizeBmp = m_cPictures[1].PictureSize(); break; case TT_FONT: cSizeBmp = m_cPictures[0].PictureSize(); break; case TT_OPENTYPE_FONT: cSizeBmp = m_cPictures[2].PictureSize(); break; case PS_OPENTYPE_FONT: cSizeBmp = m_cPictures[3].PictureSize(); break; case TYPE1_FONT: cSizeBmp = m_cPictures[4].PictureSize(); break; default: bDrawPicture = FALSE; break; } if (bDrawPicture) { iPictureHeight = cSizeBmp.cy; } TRY { if ( (lpDrawItemStruct->itemState & ODS_SELECTED) == ODS_SELECTED) { bSelected = TRUE; cpBrush = GetSysBrush( COLOR_HIGHLIGHT ); } else { bSelected = FALSE; cpBrush = GetSysBrush( COLOR_WINDOW ); } if (! cpBrush) { /*DK* ##ERROR Could not create solid brush */ AfxThrowNotSupportedException(); } bRC = cdcCombo.Attach(lpDrawItemStruct->hDC); ASSERT(bRC != 0); if (bRC == 0) { AfxThrowNotSupportedException(); } SetColorsInDC(lpDrawItemStruct->hDC, bSelected); cdcCombo.FillRect(&(lpDrawItemStruct->rcItem), cpBrush); // If this is a Printer or True Type font, draw the image/picture. if (bDrawPicture) { ix = lpDrawItemStruct->rcItem.left + 1; // 0 is focus rect //center vertically iy = lpDrawItemStruct->rcItem.top + abs(((lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top) - iPictureHeight))/2; switch (pDesc->m_iFontType) { case DEVICE_FONT: m_cPictures[1].Picture(&cdcCombo, ix, iy); break; case TT_FONT: m_cPictures[0].Picture(&cdcCombo, ix, iy); break; case TT_OPENTYPE_FONT: m_cPictures[2].Picture(&cdcCombo, ix, iy); break; case PS_OPENTYPE_FONT: m_cPictures[3].Picture(&cdcCombo, ix, iy); break; case TYPE1_FONT: m_cPictures[4].Picture(&cdcCombo, ix, iy); break; default: break; } } // set the rectangle for the text, and draw the text cRectText = lpDrawItemStruct->rcItem; cRectText.left += m_Max_cx_FontType_BMP + FONT_BMP_TXT_BORDER; cdcCombo.DrawText(*pcStringText, -1, &(cRectText), DT_LEFT | DT_SINGLELINE | DT_VCENTER); if ( (lpDrawItemStruct->itemState & ODS_FOCUS) == ODS_FOCUS) { cdcCombo.DrawFocusRect(&(lpDrawItemStruct->rcItem)); } } CATCH(CNotSupportedException,e) { /*DK* ##ERROR Internal Thown Unsupported Exception */ } END_CATCH cdcCombo.Detach(); } /******************************************************************************/ // bInverted is the same as text selected. void CTfontDlg::SetColorsInDC(HDC hdc, BOOL bInverted) { DWORD dwFGColor; DWORD dwBKColor; if (bInverted) { dwFGColor = ::GetSysColor( COLOR_HIGHLIGHTTEXT ); dwBKColor = ::GetSysColor( COLOR_HIGHLIGHT ); } else { dwFGColor = ::GetSysColor( COLOR_WINDOWTEXT ); dwBKColor = ::GetSysColor( COLOR_WINDOW ); } ::SetTextColor( hdc, dwFGColor ); ::SetBkMode ( hdc, OPAQUE ); ::SetBkColor( hdc, dwBKColor ); }