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函數將返回格式化文本的高度,而不是繪制文本。
DT_LEFT:文本左對齊,是從左向右輸出文本。
DT_RIGHT:文本右對齊,是從右向左輸出文本。
DT_WORDBREAK:當指定參數為DT_WORDBREAK時,DrawText就有了自動識別單詞的功能,它會把連在一起的英文字符或數字識了一個單詞,當一行顯示不下時,它會自動跳轉到下一行顯示,當單詞的長度超過矩形的寬度時,該單詞就不能完全顯示了。
DT_NOPREFIX:關閉前綴字符。通常DrawText將助記前綴&理解為其后字符加上下划線,前綴&&表示顯示一個&字符,指定DT_NOPREFIX格式后關閉了這種處理。
DT_BOTTOM:將正文調整到矩形底部。此值必須和DT_SINGLELINE組合。
DT_EDITCONTROL:復制多行編輯控制的正文顯示特性。
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::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::CreatePointFontIndirect()使用一個指向LOGFONT結構來初始化字體對象,使用方法與CreatePointFont()類似。
CFont::CreateFontIndirect()使用一個指向LOGFONT結構來初始化字體對象,使用方法與CreateFont()類似。
CFont::GetLogFont(LOGFONT* pLogFont)可以獲得字體的LOGFONT結構體。
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中定義的。