GDI基礎(2):繪制文本


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_CENTER:文本水平居中,是從中間向兩邊輸出文本。
DT_LEFT:文本左對齊,是從左向右輸出文本。
DT_RIGHT:文本右對齊,是從右向左輸出文本。
DT_VCENTER:指定文本垂直居中顯示。該標記只在單行文本輸出時有效,所以它必須與DT_SINGLELINE結合使用。
DT_SINGLELINE:單行顯示文本,使回車和換行符都不斷行。
DT_WORDBREAK:當指定參數為DT_WORDBREAK時,DrawText就有了自動識別單詞的功能,它會把連在一起的英文字符或數字識了一個單詞,當一行顯示不下時,它會自動跳轉到下一行顯示,當單詞的長度超過矩形的寬度時,該單詞就不能完全顯示了。
DT_NOPREFIX:關閉前綴字符。通常DrawText將助記前綴&理解為其后字符加上下划線,前綴&&表示顯示一個&字符,指定DT_NOPREFIX格式后關閉了這種處理。
DT_BOTTOM:將正文調整到矩形底部。此值必須和DT_SINGLELINE組合。
DT_EDITCONTROL:復制多行編輯控制的正文顯示特性。
 
CDC::SetTextColor()用來設置文字顯示時的顏色。
CDC::SetBkColor()用來設置文字顯示時的背景顏色。
CDC::SetBkMode()用來設置文字顯示時背景顏色的使用模式,參數TRANSPARENT為使用透明色,參數OPAQUE為使用當前顏色。
 
2、CFont字體類
字體的顯示由CFont類進行管理,如果我們想要改變顯示的字體,那么就應該將新的字體對象選入到當前DC中。與CPen、CBrush不同的是,CPen和CBrush可以通過構造函數進行初始化,而CFont只能通過調用其初始化函數來初始化,而且CFont必須進行初始化后才能使用。CFont對象初始化及操作完成后利用CDC::SelectObject()函數將該字體選入到當前設備描述表中即可使用該字體來輸出文本。
CFont類的初始化函數有:CreateFont()、CreatePointFont()、CreateFontIndirect()、CreatePointFontIndirect()等。
 
CFont::CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);
nPointSize:字體高度,以十分之一點(磅)為單位。例如120則為12點(磅)的高度。
lpszFacename:字體字樣名,如"宋體"。函數EnumFontFamilies()可以枚舉出當前所有可用字體的字樣名。
pDC:指向CDC對象,用來將nPointSize指定的高度轉換為邏輯單位,如果為NULL,則使用屏幕設備上下文進行轉換。 
在繪圖時還經常會提到邏輯和物理,例如邏輯單位、物理單位。通俗點說,邏輯的就是與具體設備無關的,甚至我們可以自定義,物理的就是由具體設備決定的了。
    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中定義的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM