1、TextOut()和DrawText()函数
CDC::TextOut()使用当前字体在窗口的指定位置处输出文本,函数声明:
virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount); BOOL TextOut(int x, int y, const CString& str);
CPaintDC dc(this); dc.TextOut(0, 100, _T("hello word"), 5);
CDC::DrawText()使用当前字体在窗口的指定矩形区域内输出指定格式的文本,如果没有特别指明,当输出文本长度大于矩形长度时,仅显示矩形内的文本。函数声明:
virtual int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat);
int DrawText(const CString& str, LPRECT lpRect, UINT nFormat);
CPaintDC dc(this); CRect rect(0, 0, 35, 20); dc.DrawText(_T("hello word"), &rect, DT_LEFT|DT_WORDBREAK|DT_NOPREFIX|DT_EDITCONTROL);
最后一个参数nFormat为文本输出的格式,可以为以下值的组合:
DT_CALCRECT:这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。
CPaintDC dc(this); CFont fontGrade;//定义CFont对象 fontGrade.CreatePointFont(100, L"宋体");//初始化 CFont* pOldFont = dc.SelectObject(&fontGrade);//将CFont对象选入到当前DC中即为设置当前字体及大小 dc.TextOut(0, 50, _T("hello world!")); dc.SelectObject(pOldFont);
②CFont::CreatePointFontIndirect(const LOGFONT* lpLogFont, CDC* pDC = NULL);
CreatePointFontIndirect()使用一个指向LOGFONT结构来初始化字体对象,使用方法与CreatePointFont()类似。
CFont::GetLogFont(LOGFONT* pLogFont)可以获得字体对象的LOGFONT结构体的拷贝。
③ CFont::CreateFont()通过指定一系列的字体特征来初始化字体对象;
BOOL CreateFont(int nHeight, //字体高度(逻辑单位) int nWidth, //字体平均宽度(逻辑单位) int nEscapement, //字体倾斜角度 int nOrientation, //字体倾斜角度 int nWeight, //字体粗细 BYTE bItalic, //是否斜体 BYTE bUnderline, //是否带下划线 BYTE cStrikeOut, //是否带删除线 BYTE nCharSet, //字体使用的字符集 BYTE nOutPrecision, //输出精确度 BYTE nClipPrecision, //裁剪精度 BYTE nQuality, //字体的输出质量 BYTE nPitchAndFamily,//字体间距和字体族 LPCTSTR lpszFacename //字体的字样名 );
使用举例:
#define CREATE_FONT(nHeight, sName) CreateFont(\ nHeight,\ 0,\ 0,\ 0,\ FW_NORMAL,\ FALSE,\ FALSE,\ 0,\ DEFAULT_CHARSET,\ OUT_DEFAULT_PRECIS,\ CLIP_DEFAULT_PRECIS,\ CLEARTYPE_QUALITY,\ DEFAULT_PITCH | FF_SWISS,\ sName\ ) void Cmfc_testDlg::OnPaint() { CPaintDC dc(this); CFont font; font.CREATE_FONT(20, _T("宋体")); CFont* pOldFont = dc.SelectObject(&font); dc.TextOut(0,50,_T("hello world")); dc.SelectObject(pOldFont); }
④ CFont::CreateFontIndirect(const LOGFONT* lpLogFont);
CreateFontIndirect()使用一个指向LOGFONT结构来初始化字体对象,使用方法与CreateFont()类似。
3、GetTextExtent()与GetTextMetrics()
CDC::GetTextExtent()用来获得指定文本在窗口显示时的大小,其返回CSize类型来表示文本的宽度和高度。
CSize GetTextExtent(const CString& str);
CSize GetTextExtent(LPCTSTR lpszString, int nCount);
CDC::GetTextMetrics()函数用来获得DC中当前字体的信息,如字体的高度,它会将字体的度量信息放到指向TEXTMETRIC类型的参数中。而它不会获得字体的宽度,因为每一个字的长度有的是不同的,一般我们用它来获得字体的高度、最大宽度和平均宽度。
BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics);
TEXTMETRIC结构类型:
typedef struct tagTEXTMETRIC {
LONG tmHeight;//字体高度
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;//字体平均宽度
LONG tmMaxCharWidth;//字体最大宽度
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
TCHAR tmFirstChar;
TCHAR tmLastChar;
TCHAR tmDefaultChar;
TCHAR tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC, *PTEXTMETRIC;
4、字符串资源
CString::LoadString(UINT nID)用来加载一个由nID标识的字符串资源,字符串资源是在资源视图下的String Table中定义的。