工程模板:http://www.javashuo.com/article/p-qwtdoncz-ep.htmlhtml
安全的文本輸出方式:git
須要額外包含頭文件strsafe.h安全
依次使用如下三個函數:函數
1.StringCchPrintfui
2.StringCchLengthspa
3.TextOutorm
StringCchPrintf:htm
STRSAFEAPI StringCchPrintfA ( STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszFormat, ... );
將格式化數據寫入指定的字符串。向函數提供目標緩衝區的大小,以確保它不會寫入超過該緩衝區的結尾。blog
第一個參數是待寫入的字符串,可以使用TCHAR定義(不可省略長度);字符串
第二個參數是緩衝區大小,儘可能使用合適的長度,可稍大於字符串長度,使用size_t定義;
第三個參數規定了文本的輸入方式,並可引入其它變量進行輸入經過轉換修飾符「%」,可直接經過TEXT(" ")進行編輯;
添加的參數要與轉換修飾符一一對應。
StringCchLength:
STRSAFEAPI StringCchLengthW ( STRSAFE_PCNZWCH psz, size_t cchMax, size_t *pcchLength );
肯定字符串是否超過指定的長度(以字符爲單位)。
第一個參數使用與上個函數相同的字符串名;
第二個參數是字符串最大長度;
第三個參數是存儲字符串實際長度的變量,使用size_t進行定義,但傳入的是其地址,要使用地址運算「&」。
TextOut:
BOOL TextOutA( HDC hdc, int x, int y, LPCSTR lpString, int c );
第一個參數是獲取設備環境上下文的句柄,在模板中已經定義過;
第2、第三個參數是目標顯示位置的座標,即文本矩形的左上角,默認單位像素點;
第四個參數與前二個函數的第一參數同樣;
第五個參數使用上一個函數第四個參數的內容,爲目標字符串的實際長度。
輸入到下一行:
使用GetTextMetrics:
BOOL GetTextMetrics ( HDC hdc, LPTEXTMETRIC lptm );
爲此須要定義一個
TEXTMETRIC的結構:
typedef struct tagTEXTMETRICA { LONG tmHeight; LONG tmAscent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; LONG tmWeight; LONG tmOverhang; LONG tmDigitizedAspectX; LONG tmDigitizedAspectY; BYTE tmFirstChar; BYTE tmLastChar; BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmPitchAndFamily; BYTE tmCharSet; } TEXTMETRICA, *PTEXTMETRICA, *NPTEXTMETRICA, *LPTEXTMETRICA;
Windows字符結構:
所以tmHeight + tmExternalLeading就是兩行文本基準點的高度差。
#include<Windows.h> #include<strsafe.h> const int STRSIZE = 16; const int X = 0; const int Y = 0; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdshow, int iCmdshow) { …… } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; int xstr = X; int ystr = X; TCHAR szstr[STRSIZE]; size_t strsize; TEXTMETRIC tm; static int cxchar; static int cychar; switch (message) { case WM_CREATE: hdc = GetDC(hwnd); GetTextMetrics(hdc, &tm); cxchar = tm.tmAveCharWidth; cychar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC(hwnd, hdc); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); StringCchPrintf(szstr, STRSIZE, TEXT("%s: %u"), TEXT("Output"), 1); StringCchLength(szstr, STRSIZE, &strsize); TextOut(hdc, xstr, ystr, szstr, strsize); StringCchPrintf(szstr, STRSIZE, TEXT("%s: %u"), TEXT("Output"), 2); StringCchLength(szstr, STRSIZE, &strsize); TextOut(hdc, xstr, ystr + cychar, szstr, strsize); EndPaint(hwnd, &ps); return 0; …… case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, message, wParam, lParam); } }