본문 바로가기

Windows/MFC

Font

[code]// Day7Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "Day7.h"
#include "Day7Dlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
        // No message handlers
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDay7Dlg dialog

CDay7Dlg::CDay7Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CDay7Dlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CDay7Dlg)
    m_strSampText = _T("");
    m_strDisplayText = _T("");
    m_strFontName = _T("");
    m_bUseText = FALSE;
    m_bItalic = FALSE;
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDay7Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDay7Dlg)
    DDX_Control(pDX, IDC_DISPLAYTEXT, m_ctlDisplayText);
    DDX_Control(pDX, IDC_LFONTS, m_ctlFontList);
    DDX_Text(pDX, IDC_ESAMPTEXT, m_strSampText);
    DDX_Text(pDX, IDC_DISPLAYTEXT, m_strDisplayText);
    DDX_LBString(pDX, IDC_LFONTS, m_strFontName);
    DDX_Check(pDX, IDC_CBUSETEXT, m_bUseText);
    DDX_Check(pDX, IDC_CBITALIC, m_bItalic);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDay7Dlg, CDialog)
    //{{AFX_MSG_MAP(CDay7Dlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_EXIT, OnExit)
    ON_EN_CHANGE(IDC_ESAMPTEXT, OnChangeEsamptext)
    ON_LBN_SELCHANGE(IDC_LFONTS, OnSelchangeLfonts)
    ON_BN_CLICKED(IDC_CBUSETEXT, OnCbusetext)
    ON_BN_CLICKED(IDC_CBITALIC, OnCbitalic)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDay7Dlg message handlers

BOOL CDay7Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog. The framework does this automatically
    // when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    // TODO: Add extra initialization here

    ///////////////////////
    // MY CODE STARTS HERE
    ///////////////////////

    // Fill the font list box
    FillFontList();

    // Initialize the text to be entered
    m_strSampText = "Testing";
    // Copy the text to the font sample area
    m_strDisplayText = m_strSampText;
    // Initialize the check box
    m_bUseText = TRUE;
    // Update the dialog
    UpdateData(FALSE);

    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
    
    return TRUE; // return TRUE unless you set the focus to a control
}

void CDay7Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CDay7Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDay7Dlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}

void CDay7Dlg::OnExit()
{
    // TODO: Add your control notification handler code here
    
    ///////////////////////
    // MY CODE STARTS HERE
    ///////////////////////

    // Close the window
    OnOK();

    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
}

int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf, LPNEWTEXTMETRIC lpntm, DWORD nFontType, long lParam)
{
    // Create a pointer to the dialog window
    CDay7Dlg* pWnd = (CDay7Dlg*) lParam;

    // Add the font name to the list box
    pWnd->m_ctlFontList.AddString(lpelf->elfLogFont.lfFaceName);
    // Return 1 to continue font enumeration
    return 1;
}

void CDay7Dlg::FillFontList()
{
    int iCount;                // The number of fonts
    int iCurCount;            // The current font
    CString strCurFont;            // The current font name
    CString strPrevFont = "";    // The previous font name
    LOGFONT lf;
    lf.lfCharSet = DEFAULT_CHARSET;
    strcpy(lf.lfFaceName, "");

    // Clear the list box
    m_ctlFontList.ResetContent();
    // Create a device context variable
    CClientDC dc (this);
    // Enumerate the font families
    ::EnumFontFamiliesEx((HDC) dc, &lf, (FONTENUMPROC) EnumFontFamProc, (LPARAM) this, 0);
    // Get the number of fonts in the list box
    iCount = m_ctlFontList.GetCount();
    // Loop from the last entry in the list box to the first,
    // searching for and deleting the duplicate entries
    for (iCurCount = iCount; iCurCount > 0; iCurCount--)
    {
        // Get the current font name
        m_ctlFontList.GetText((iCurCount - 1), strCurFont);
        // Is it the same as the previous font name?
        if (strCurFont == strPrevFont)
        {
            // If yes, then delete it
            m_ctlFontList.DeleteString((iCurCount - 1));
        }
        // Set the previous font name to the current font name
        strPrevFont = strCurFont;
    }
}

void CDay7Dlg::OnChangeEsamptext()
{
    // TODO: If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialog::OnInitialUpdate()
    // function and call CRichEditCrtl().SetEventMask()
    // with the EN_CHANGE flag ORed into the mask.
    
    // TODO: Add your control notification handler code here
    
    ///////////////////////
    // MY CODE STARTS HERE
    ///////////////////////

    // Update the variables with the dialog controls
    UpdateData(TRUE);
    // Using the text for the font sample?
    if (m_bUseText)
    {
        // Copy the current text to the font sample
        m_strDisplayText = m_strSampText;
        // Update the dialog with the variables
        UpdateData(FALSE);
    }

    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
}

void CDay7Dlg::OnSelchangeLfonts()
{
    // TODO: Add your control notification handler code here
    
    ///////////////////////
    // MY CODE STARTS HERE
    ///////////////////////

    // Update the variables with the dialog controls
    UpdateData(TRUE);
    // Using the font name for the font sample?
    if (!m_bUseText)
    {
        // Copy the font name to the font sample
        m_strDisplayText = m_strFontName;
        // Update the dialog with the variables
        UpdateData(FALSE);
    }
    // Set the font for the sample
    SetMyFont();

    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
}

void CDay7Dlg::SetMyFont()
{
//    CFont fSampFont;    // The font to be used
    CRect rRect;        // The rectangle of the display area
    int iHeight;        // The height of the display area
    int iItalic = 0;    // Italicize the font?

    // Has a font been selected?
    if (m_strFontName != "")
    {
        // Get the dimensions of the font sample display area
        m_ctlDisplayText.GetWindowRect(&rRect);
        // Calculate the area height
        iHeight = rRect.top - rRect.bottom;
        // Make sure the height is positive
        if (iHeight < 0)
            iHeight = 0 - iHeight;
        if (m_bItalic)
            iItalic = 1;
        // Release the current font
        m_fSampFont.Detach();
        // Create the font to be used
        m_fSampFont.CreateFont((iHeight - 5), 0, 0, 0, FW_NORMAL,
                iItalic, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS,
                CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH |
                FF_DONTCARE, m_strFontName);

        // Set the font for the sample display area
        m_ctlDisplayText.SetFont(&m_fSampFont);
    }
}

void CDay7Dlg::OnCbusetext()
{
    // TODO: Add your control notification handler code here
    
    ///////////////////////
    // MY CODE STARTS HERE
    ///////////////////////

    // Update the variables with the dialog controls
    UpdateData(TRUE);
    // Using the font name for the font sample?
    if (!m_bUseText)
        // Using the font name
        m_strDisplayText = m_strFontName;
    else
        // Using the entered text
        m_strDisplayText = m_strSampText;

    // Update the dialog
    UpdateData(FALSE);

    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
}


void CDay7Dlg::OnBdispfontlist()
{
    // TODO: Add your control notification handler code here
    int iCount;                // The number of fonts
    int iCurCount;            // The current font
    CString strCurFont;            // The current font name
    
    // Get the number of fonts in the list box
    iCount = m_ctlFontList.GetCount();
    // Loop from the last entry in the list box to the first,
    // searching for and deleting the duplicate entries
    for (iCurCount = 0; iCurCount < iCount; iCurCount++)
    {
        // Get the current font name
        m_ctlFontList.GetText((iCurCount - 1), strCurFont);
    }
}



void CDay7Dlg::OnCbitalic()
{
    // TODO: Add your control notification handler code here

    ///////////////////////
    // MY CODE STARTS HERE
    ///////////////////////

    // Update the variables with the dialog controls
    UpdateData(TRUE);

    // Set the font for the sample
    SetMyFont();

    ///////////////////////
    // MY CODE ENDS HERE
    ///////////////////////
}
[/code]