如何为CEditView设置字体? 如何为CEditView设置字体?(先弹出字体选择对话框) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CFontDialog选择字体然后CreateFont+SetFont 需要在CEditview的父窗口里重载OnCtrlColor消息.就好了 能不能给个具体的代码?比如响应菜单消息:void CNotepadView::OnEditFont() { // 弹出字体选择对话框: ... // 应用字体: ...} 我程序里的一段,用来选择字体, 各种字体以对应的字体显示#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 #include "stdafx.h"#include "EIENIRC.h"#include "FontSelDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic 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_MAPEND_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_MAPEND_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里 谢谢各位!后来查了MSDN发现:不能直接对CEditView调用SetFont(),必须创建一个类成员变量CFont font和LOGFONT lf,然后使用CEditView::SetFont(font)就可以了. [■▲■] 毕业设计 致 谢 ! 有图有真相 ★ 使用MAPI函数MAPISendMail碰到的问题,有点怪,专家请进 字符输入时怎么判断键盘输入? 负载均衡方面的一个问题(劫持用户) 聊天器的问题 字符串问题,请进来看看,我查半天了,没搞懂。 100分! 用flash控件做的flash播放器怎样用自己的右键菜单替换它自带的菜单。 COM编译出错,请高手看看! 求ACTIVEX相关电子书和历程 求Telnet client端源代码(VC++或是BCB) 一定给分! 切分窗口有问题 关于在子线程中创建对话框的问题。
然后CreateFont+SetFont
就好了
比如响应菜单消息:
void CNotepadView::OnEditFont()
{
// 弹出字体选择对话框:
...
// 应用字体:
...
}
#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
#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里
后来查了MSDN发现:不能直接对CEditView调用SetFont(),
必须创建一个类成员变量CFont font和LOGFONT lf,然后使用
CEditView::SetFont(font)就可以了.