2277 lines
67 KiB
C++
2277 lines
67 KiB
C++
/******************************************************************************/
|
|
/* 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 <memory.h>
|
|
#include <tchar.h>
|
|
#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 <penwin.h> // 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;i<nCount;i++)
|
|
delete GetFontDesc(i);
|
|
|
|
ResetContent();
|
|
}
|
|
|
|
BOOL CFontComboBox::IsSameName(CFontDesc* pDesc, int index)
|
|
{
|
|
CFontDesc* pDescOther = GetFontDesc(index);
|
|
if (pDescOther == (CFontDesc*)CB_ERR)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
return(lstrcmp(pDesc->m_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 );
|
|
}
|
|
|