⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fontpg.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////
//  File:    fontpg.cpp
//  Version: 1.1.0.4
//  Updated: 19-Jul-1998
//
//  Copyright:  Ferdinand Prantl, portions by Stcherbatchenko Andrei
//  E-mail:     prantl@ff.cuni.cz
//
//  Property page to set font style
//
//  You are free to use or modify this code to the following restrictions:
//  - Acknowledge me somewhere in your about box, simple "Parts of code by.."
//  will be enough. If you can't (or don't want to), contact me personally.
//  - LEAVE THIS HEADER INTACT
////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "fontpg.h"
#include "ccrystaltextbuffer.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFontPage property page

IMPLEMENT_DYNCREATE(CFontPage, CPropertyPage)

CFontPage::CFontPage(CCrystalTextView *pParent /*= NULL*/, LPLOGFONT pLogFont /*= NULL*/) : CPropertyPage(CFontPage::IDD), m_pParent (pParent), m_pLogFont (pLogFont)
{
    //{{AFX_DATA_INIT(CFontPage)
    //}}AFX_DATA_INIT
    CWindowDC dc(GetDesktopWindow() );
    m_cyPixelsPerInch = GetDeviceCaps(dc, LOGPIXELSY);
    if (!m_pLogFont)
      {
        m_pLogFont = &CCrystalTextView::m_LogFont;
        /*m_pLogFont = &m_LogFont;
        CFont *pFont = dc.GetCurrentFont ();
        pFont->GetLogFont (m_pLogFont);*/
      }
    m_fontSample.CreateFontIndirect (m_pLogFont);
    m_sFont = m_pLogFont->lfFaceName;
    m_sSize.Format (_T ("%d"), -MulDiv (m_pLogFont->lfHeight, 72, m_cyPixelsPerInch));
    static BYTE CharSetCodes[] = { 177, 178, 161, 162, 186, 238, 204, 0 };
    static LPCTSTR CharSetNames[] = { _T("Western"), _T("Hebrew"), _T("Arabic"), _T("Greek"),
      _T("Turkish"), _T("Baltic"), _T("Central European"), _T("Cyrillic") };
    LPBYTE p = (LPBYTE) _tcschr ((LPCTSTR) CharSetCodes, m_pLogFont->lfCharSet);
    if (p && *p)
      m_sScript = CharSetNames[(p - CharSetCodes) + 1];
    else
      m_sScript = _T("Western");
    m_nEncoding = CCrystalTextBuffer::m_nDefaultEncoding;
    m_bRecode = m_nEncoding >= 0;
}

CFontPage::~CFontPage()
{
}

void CFontPage::DoDataExchange(CDataExchange* pDX)
{
    CPropertyPage::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CFontPage)
    DDX_Control(pDX, IDC_SAMPLE, m_staticSample);
    DDX_Control(pDX, IDC_FONT, m_comboFont);
    DDX_Control(pDX, IDC_FONTSIZE, m_comboSize);
    DDX_Control(pDX, IDC_SCRIPT, m_comboScript);
  	DDX_Control(pDX, IDC_ENCODING, m_comboEncoding);
    DDX_CBString(pDX, IDC_FONT, m_sFont);
    DDX_CBString(pDX, IDC_FONTSIZE, m_sSize);
    DDV_MaxChars(pDX, m_sSize, LF_FACESIZE);
    DDX_CBString(pDX, IDC_SCRIPT, m_sScript);
    DDX_Check(pDX, IDC_RECODE, m_bRecode);
  	DDX_CBIndex(pDX, IDC_ENCODING, m_nEncoding);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFontPage, CPropertyPage)
    //{{AFX_MSG_MAP(CFontPage)
    ON_CBN_SELCHANGE(IDC_FONT, OnSelChange)
    ON_CBN_SELCHANGE(IDC_FONTSIZE, OnSelChange)
    ON_CBN_SELCHANGE(IDC_SCRIPT, OnSelChange)
    ON_CBN_KILLFOCUS(IDC_FONT, OnSelChange)
    ON_CBN_KILLFOCUS(IDC_FONTSIZE, OnSelChange)
    ON_CBN_KILLFOCUS(IDC_SCRIPT, OnSelChange)
    ON_BN_CLICKED(IDC_RECODE, OnRecode)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFontPage message handlers

extern EDITPADC_CLASS LPCTSTR pszCodeNames[];
extern EDITPADC_CLASS void FillComboBox (CComboBox &Control, LPCTSTR *pszItems);

BOOL CFontPage::OnInitDialog() 
{
    CPropertyPage::OnInitDialog();
    /*m_imagesFont.Create (IDB_FONTTYPE, 11, 2, RGB (0, 255, 0));
    m_imagesFont.SetBkColor (GetSysColor (COLOR_WINDOW));
    m_comboFont.SetImageList (&m_imagesFont);*/
    m_comboFont.SetItemHeight (-1, 15);
    m_comboFont.SetItemHeight (0, 14);
    m_comboSize.SetItemHeight (-1, 15);
    m_comboSize.SetItemHeight (0, 14);
    CRect rc, rc2;
    m_comboSize.GetWindowRect (rc);
    m_comboFont.GetWindowRect (rc2);
    m_comboFont.SetWindowPos (NULL, -1, -1, rc2.Width (), rc.Height (), SWP_NOZORDER|SWP_NOMOVE);
    CWindowDC dc(this);
    LOGFONT logfont;
    logfont.lfCharSet = DEFAULT_CHARSET;
    logfont.lfFaceName[0] = '\0';
    logfont.lfPitchAndFamily = 0;
    EnumFontFamiliesEx (dc.m_hDC, &logfont, (FONTENUMPROC)FontEnumProc, (LPARAM) this, 0);
    int /*i, */j = m_comboFont.FindStringExact (0, m_sFont);
    if (j >= 0)
      m_comboFont.SetCurSel (j);
    
    // Fill Size combobox with "common" sizes
    /*static LPCTSTR FontSizes[] = { _T("8"), _T("9"), _T("10"), _T("11"), _T("12"), _T("14"),
                _T("16"), _T("18"), _T("20"), _T("22"), _T("24"), _T("26"), 
                _T("28"), _T("36"), _T("48"), _T("72") };
    for (i = 0, j = -1; i < (sizeof(FontSizes)/sizeof(FontSizes[0])); i++)
      {
        m_comboSize.AddString(FontSizes[i]);
        if (!_tcscmp (FontSizes[i], m_sSize))
          j = i;
      }
    if (j >= 0)
      m_comboSize.SetCurSel (j);*/
    j = m_comboSize.FindStringExact (0, m_sSize);
    if (j >= 0)
      m_comboSize.SetCurSel (j);

    // Fill Script combobox with "common" scripts
    /*static LPCTSTR CharSetNames[] = { _T("Western"), _T("Hebrew"), _T("Arabic"), _T("Greek"),
      _T("Turkish"), _T("Baltic"), _T("Central European"), _T("Cyrillic") };
    for (i = 0, j = -1; i < (sizeof(CharSetNames)/sizeof(CharSetNames[0])); i++)
      {
        m_comboScript.AddString(CharSetNames[i]);
        if (!_tcscmp (CharSetNames[i], m_sScript))
          j = i;
      }
    if (j >= 0)
      m_comboScript.SetCurSel (j);*/
    j = m_comboScript.FindStringExact (0, m_sScript);
    if (j >= 0)
      m_comboScript.SetCurSel (j);

    FillComboBox (m_comboEncoding, pszCodeNames);
    m_comboEncoding.SetCurSel (m_nEncoding);
    m_comboEncoding.EnableWindow (m_bRecode);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

int CALLBACK CFontPage::FontEnumProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, 
        int FontType, CFontPage* pFontPage )
{
    if( pFontPage->m_comboFont.FindStringExact( 0, lpelfe->elfLogFont.lfFaceName ) == CB_ERR &&
      lpelfe->elfLogFont.lfPitchAndFamily & FIXED_PITCH)
      {
        // Add to list
        /*COMBOBOXEXITEM item;
        item.mask = CBEIF_IMAGE|CBEIF_TEXT|CBEIF_SELECTEDIMAGE;
        item.iItem = pFontPage->m_comboFont.GetCount ();
        item.pszText = (LPTSTR)(LPCTSTR)lpelfe->elfFullName;
        item.iImage = item.iSelectedImage = 1;
        pFontPage->m_comboFont.InsertItem (&item);*/
        int item = pFontPage->m_comboFont.AddString( lpelfe->elfLogFont.lfFaceName );
        pFontPage->m_comboFont.SetItemData (item, lpelfe->elfLogFont.lfOutPrecision != OUT_STRING_PRECIS);
      }

    return 1;
}

void CFontPage::OnRecode() 
{
  UpdateData ();
  m_comboEncoding.EnableWindow (m_bRecode);
}

void CFontPage::OnSelChange() 
{
  // The selection hasn't changed yet, so change it
  if( IsChild( GetFocus() ) && 
          GetFocus()->GetParent()->IsKindOf( RUNTIME_CLASS( CComboBox ) ) )
  {
      CComboBox *cb = (CComboBox *)GetFocus()->GetParent();
      CString sText;
      if( cb->GetCurSel() != CB_ERR )
      {
          cb->GetLBText( cb->GetCurSel(), sText );
          cb->SetWindowText( sText );
      }
  }

  UpdateData(TRUE);
  
  m_fontSample.GetLogFont( &m_LogFont );
  memcpy( m_LogFont.lfFaceName, m_sFont, LF_FACESIZE );

  m_LogFont.lfHeight = -MulDiv(_ttoi (m_sSize), m_cyPixelsPerInch, 72);
  static BYTE CharSetCodes[] = { 0, 177, 178, 161, 162, 186, 238, 204 };
  m_LogFont.lfCharSet = CharSetCodes[m_comboScript.GetCurSel ()];

  m_fontSample.DeleteObject();
  m_fontSample.CreateFontIndirect( &m_LogFont );
  m_staticSample.SetFont(&m_fontSample);  
  SetModified ();
}

void CFontPage::OnOK() 
{
	CPropertyPage::OnOK();
  m_fontSample.GetLogFont (m_pLogFont);
  if (m_pParent)
    {
      m_pParent->SetFont (*m_pLogFont);
    }
  SetModified (FALSE);
  CCrystalTextBuffer::m_nDefaultEncoding = m_bRecode ? m_nEncoding : -1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -