如何为CEditView设置字体?(先弹出字体选择对话框)

解决方案 »

  1.   

    CFontDialog选择字体
    然后CreateFont+SetFont
      

  2.   

    需要在CEditview的父窗口里重载OnCtrlColor消息.
    就好了
      

  3.   

    能不能给个具体的代码?
    比如响应菜单消息:
    void CNotepadView::OnEditFont() 
    {
    // 弹出字体选择对话框:
    ...
    // 应用字体:
    ...
    }
      

  4.   

    我程序里的一段,用来选择字体, 各种字体以对应的字体显示#if !defined(AFX_FONTSELDLG_H__65C5D3F2_E49E_4FA7_92AE_8673558B008E__INCLUDED_)
    #define AFX_FONTSELDLG_H__65C5D3F2_E49E_4FA7_92AE_8673558B008E__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif#include <afxtempl.h>#define FCB_IMAGEWIDTH  15
    #define FCB_STARTPOS 2
    #define FCB_DRAWNORMAL 1
    #define FCB_DRAWRAISED 2
    #define FCB_DRAWPRESSD 4
    #define FONT_LIST_HEIGHT 20typedef struct tagFCBDATA{
    LOGFONT lf;
    UINT flag;
    }FCBDATA, *PFCBDATA;class CFontList : public CListBox
    {
    public:
    CFontList();
    void Initialize();public:
    //{{AFX_VIRTUAL(CFontList)
    public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
    virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
    protected:
    virtual void PostNcDestroy();
    //}}AFX_VIRTUALpublic:
    virtual ~CFontList();protected:
    CImageList m_imagelist;
    CTypedPtrMap<CMapStringToPtr, CString, PFCBDATA> m_mapFont;
    static BOOL CALLBACK AFX_EXPORT EnumScreenFontCallbackFn(ENUMLOGFONTEX* pelf,
    NEWTEXTMETRICEX*, int FontType, LPVOID pThis);
    BOOL EnumFont(); //{{AFX_MSG(CFontList)
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };class CFontSelDlg : public CDialog
    {
    public:
    CFontSelDlg(CWnd* pParent = NULL);
    int m_LastFontIdx; //{{AFX_DATA(CFontSelDlg)
    enum { IDD = IDD_FONTSELECT };
    CFontList m_FontList;
    //}}AFX_DATA //{{AFX_VIRTUAL(CFontSelDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    //}}AFX_VIRTUALprotected: //{{AFX_MSG(CFontSelDlg)
    virtual void OnOK();
    virtual BOOL OnInitDialog();
    virtual void OnCancel();
    afx_msg void OnFontDefault();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };//{{AFX_INSERT_LOCATION}}#endif
      

  5.   

    #include "stdafx.h"
    #include "EIENIRC.h"
    #include "FontSelDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifextern CString FontName;
    extern CFont* pFont;
    extern CFont* pBFont;
    extern CFont* pUFont;CFontSelDlg::CFontSelDlg(CWnd* pParent)
    : CDialog(CFontSelDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CFontSelDlg)
    //}}AFX_DATA_INIT
    m_LastFontIdx = 0;
    }void CFontSelDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CFontSelDlg)
    DDX_Control(pDX, IDC_FONTLIST, m_FontList);
    //}}AFX_DATA_MAP
    }BEGIN_MESSAGE_MAP(CFontSelDlg, CDialog)
    //{{AFX_MSG_MAP(CFontSelDlg)
    ON_BN_CLICKED(IDC_FONT_DEFAULT, OnFontDefault)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CFontSelDlg::OnOK() 
    {
    if( m_FontList.GetCurSel() != -1 )
    if( m_LastFontIdx != m_FontList.GetCurSel() )
    {
    FontName = CString((LPCTSTR)m_FontList.GetItemData(m_FontList.GetCurSel()));
    pFont->DeleteObject();
    pBFont->DeleteObject();
    pUFont->DeleteObject();
    SAFE_DELETE( pFont );
    SAFE_DELETE( pBFont );
    SAFE_DELETE( pUFont );
    pFont = new CFont;
    if(pFont != NULL)
    pFont->CreateFont( 19, 0, 0, 0, FW_NORMAL, FALSE,                     
    FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,        
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,           
    DEFAULT_PITCH | FF_SWISS, FontName);   pBFont = new CFont;
    if(pBFont != NULL)
    pBFont->CreateFont( 19, 0, 0, 0, FW_BOLD, FALSE,                     
    FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,        
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,           
    DEFAULT_PITCH | FF_SWISS, FontName);   pUFont = new CFont;
    if(pUFont != NULL)
    pUFont->CreateFont( 19, 0, 0, 0, FW_NORMAL, FALSE,                     
    TRUE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,        
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,           
    DEFAULT_PITCH | FF_SWISS, FontName); AfxGetMainWnd()->PostMessage(WM_USER_FONTCHGED, 0, 0);
    }
    CDialog::OnOK();
    }BOOL CFontSelDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();
    m_FontList.Initialize();
    m_LastFontIdx = m_FontList.FindStringExact(0, FontName);
    m_FontList.SetCurSel(m_LastFontIdx);
    return TRUE;
    }void CFontSelDlg::OnCancel() 
    {
    m_FontList.SetCurSel(m_LastFontIdx);
    CDialog::OnCancel();
    }void CFontSelDlg::OnFontDefault() 
    {
    m_FontList.SetCurSel(m_FontList.FindStringExact(0, "Fixedsys"));
    }//************** CFontList***********CFontList::CFontList()
    {
    }CFontList::~CFontList()
    {
    }BEGIN_MESSAGE_MAP(CFontList, CListBox)
    //{{AFX_MSG_MAP(CFontList)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CFontList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    ASSERT(pDC); CRect rect(lpDrawItemStruct->rcItem); if (lpDrawItemStruct->itemState & ODS_FOCUS)
    pDC->DrawFocusRect(rect); int nIndexDC = pDC->SaveDC(); CBrush brush;
    if (lpDrawItemStruct->itemState & ODS_SELECTED)
    {
    brush.CreateSolidBrush(::GetSysColor(COLOR_HIGHLIGHT));
    pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    }
    else
    brush.CreateSolidBrush(pDC->GetBkColor()); pDC->SetBkMode(TRANSPARENT);
    pDC->FillRect(rect, &brush); CString strCurFont((LPCTSTR) lpDrawItemStruct->itemData);
    m_imagelist.Draw(pDC, 0, CPoint(rect.left,rect.top+2),ILD_TRANSPARENT);
    rect.left += FCB_IMAGEWIDTH + 2;
    LOGFONT lf;
    ::ZeroMemory( &lf, sizeof(lf) );
    strcpy(lf.lfFaceName, strCurFont);
    lf.lfCharSet = DEFAULT_CHARSET;
    lf.lfHeight = FONT_LIST_HEIGHT;
    CFont font;
    font.CreateFontIndirect( &lf ); CFont* pof = pDC->SelectObject(&font);
    pDC->TextOut(rect.left, rect.top, strCurFont);
    pDC->SelectObject(pof);
    font.DeleteObject(); pDC->RestoreDC(nIndexDC);
    }BOOL CFontList::EnumFont()
    {
    HDC hDC = ::GetWindowDC(NULL);
    LOGFONT lf;
    ZeroMemory(&lf,sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET;
    if (!EnumFontFamiliesEx(hDC, &lf, (FONTENUMPROC)EnumScreenFontCallbackFn,
    (LPARAM) this, (DWORD) 0))
    return FALSE;
    ::ReleaseDC(NULL,hDC);
    return TRUE;
    }BOOL CALLBACK AFX_EXPORT CFontList::EnumScreenFontCallbackFn(ENUMLOGFONTEX* pelf, 
    NEWTEXTMETRICEX*, int FontType, LPVOID pThis){
    if(pelf->elfLogFont.lfCharSet == SYMBOL_CHARSET)
    return 1;
    LPCTSTR lpszFace = pelf->elfLogFont.lfFaceName;
    FCBDATA* pFCBData = NULL;
    if ( ! strchr(lpszFace, '@') && ! ((CFontList*)pThis)->m_mapFont.Lookup(lpszFace, pFCBData))
    {
    pFCBData = new FCBDATA;
    pFCBData->flag = 0;
    pFCBData->lf = pelf->elfLogFont;
    ((CFontList*)pThis)->m_mapFont.SetAt(lpszFace, pFCBData);
    }
    return 1;
    }void CFontList::Initialize()
    {
    int cxMax = 0;
    CDC* pDC = GetDC();
    FCBDATA* pFCBData = NULL;
    CString strKey, strComp;
    CFont font; EnumFont();
    ResetContent(); POSITION pos = m_mapFont.GetStartPosition();
    while (pos)
    {
    m_mapFont.GetNextAssoc(pos, strKey, pFCBData);
    AddString(strKey);
    }
    m_imagelist.Create(IDB_FONTTYPE, 15, 1, RGB(255,0,255) );
    }void CFontList::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
    {
    lpMeasureItemStruct->itemHeight = FONT_LIST_HEIGHT;
    }int CFontList::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct) 
    {
       LPCTSTR lpszText1 = (LPCTSTR) lpCompareItemStruct->itemData1;
       LPCTSTR lpszText2 = (LPCTSTR) lpCompareItemStruct->itemData2;
       return strcmp(lpszText1, lpszText2);
    }void CFontList::PostNcDestroy() 
    {
    m_imagelist.DeleteImageList();
    FCBDATA * pFCBData;
    CString strKey;
    POSITION pos = m_mapFont.GetStartPosition();
    while (pos)
    {
    m_mapFont.GetNextAssoc(pos, strKey, pFCBData);
    delete pFCBData;
    }
    CListBox::PostNcDestroy();
    }字体显示在对话框中的LISTBOX里
      

  6.   

    谢谢各位!
    后来查了MSDN发现:不能直接对CEditView调用SetFont(),
    必须创建一个类成员变量CFont font和LOGFONT lf,然后使用
    CEditView::SetFont(font)就可以了.