Win32API文本處理

工程模板: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);
	}
}
相關文章
相關標籤/搜索