如何为CEditView设置字体?

廖雪峰 2002-09-08 09:39:51
如何为CEditView设置字体?(先弹出字体选择对话框)
...全文
220 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
廖雪峰 2002-09-19
  • 打赏
  • 举报
回复
谢谢各位!
后来查了MSDN发现:不能直接对CEditView调用SetFont(),
必须创建一个类成员变量CFont font和LOGFONT lf,然后使用
CEditView::SetFont(font)就可以了.
everandforever 2002-09-11
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "EIENIRC.h"
#include "FontSelDlg.h"

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

extern 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里
everandforever 2002-09-11
  • 打赏
  • 举报
回复
我程序里的一段,用来选择字体, 各种字体以对应的字体显示

#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 20

typedef 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_VIRTUAL

public:
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_VIRTUAL

protected:

//{{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
廖雪峰 2002-09-09
  • 打赏
  • 举报
回复
能不能给个具体的代码?
比如响应菜单消息:
void CNotepadView::OnEditFont()
{
// 弹出字体选择对话框:
...
// 应用字体:
...
}
siphonelee 2002-09-08
  • 打赏
  • 举报
回复
CFontDialog选择字体
然后CreateFont+SetFont
Fishcat 2002-09-08
  • 打赏
  • 举报
回复
需要在CEditview的父窗口里重载OnCtrlColor消息.
就好了

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧