原文地址:http://blog.csdn.net/softn/article/details/51718347
前面無論是使用文本輸出函數還是 static 控件,字體都是默認的,比較丑陋,我們完全可以自己創建更加炫酷的字體。
創建字體使用 CreateFont 函數,它的原型是:
- HFONT CreateFont(
- int cHeight, //字體的邏輯高度
- int cWidth, //字體的邏輯寬度
- int cEscapement, //指定移位向量相對X軸的偏轉角度
- int cOrientation, //指定字符基線相對X軸的偏轉角度
- int cWeight, //設置字體粗細程度
- DWORD bItalic, //是否啟用斜體
- DWORD bUnderline, //是否啟用下划線
- DWORD bStrikeOut, //是否啟用刪除線
- DWORD iCharSet, //指定字符集
- DWORD iOutPrecision, //輸出精度
- DWORD iClipPrecision, //剪裁精度
- DWORD iQuality, //輸出質量
- DWORD iPitchAndFamily, //字體族
- LPCSTR pszFaceName //字體名
- );
上面的14個參數完全記住幾乎不可能,下面是簡單的說明,其他的“照貓畫虎”即可。
1) 參數 cWidth 和 cHeight 通常取負值,且高度為寬度的2倍,如 -18 和 -9,即可指定 13.5 |(H+W)/2| 磅的字體。
2) 對於字體粗細程度 cWeight,可以使用 FW_ 開頭的宏定義;一般取 FW_NORMAL (400),此參數需要值的值域為 [0,1000]。
3) 對於參數 bItalic、bUnderline、bStrikeOut,直接使用 TRUE 或 FALSE 傳值即可。
4) 對於字符集 iCharSet,一般可以直接使用 DEFAULT_CHARSET 讓系統自動處理。
注意:字體也是一種 GDI 對象,使用完后也要在 WM_DESTROY 消息中刪除。
創建完字體后並不能立即使用,還需要手動觸發 WM_SETFONT 消息,讓Windows 將當前字體設置為我們創建的字體。
發送消息使用 SendMessage 函數,它可以讓我們在必要時主動向窗口發送各種消息,原型為:
- LRESULT SendMessage(
- HWND hWnd, //發送消息的目標窗口句柄
- UINT msg, //將要發送的消息
- WPARAM wParam, //附加消息1
- LPARAM lParam //附加消息2
- );
這些參數和 WndProc 函數非常類似。沒錯,SendMessage 發送的消息就是由窗口過程來處理的。
設置字體的消息是 WM_SETFONT,只要向附加參數 wParam 傳入 CreateFont 返回的句柄即可(需要轉換到 WPARAM 類型)。請看下面的例子:
- //窗口過程
- LRESULT CALLBACK WndProc(
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam
- ){
- PAINTSTRUCT ps;
- HDC hdc;
- static HFONT hFont; //聲明一個邏輯字體句柄為靜態變量
- static HWND labExample; //在初期,我們將其聲明為靜態變量
- switch (message){
- case WM_CREATE:
- //創建邏輯字體
- hFont = CreateFont(
- -15/*高度*/, -7.5/*寬度*/, 0/*不用管*/, 0/*不用管*/, 400 /*一般這個值設為400*/,
- FALSE/*不帶斜體*/, FALSE/*不帶下划線*/, FALSE/*不帶刪除線*/,
- DEFAULT_CHARSET, //這里我們使用默認字符集,還有其他以 _CHARSET 結尾的常量可用
- OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //這行參數不用管
- DEFAULT_QUALITY, //默認輸出質量
- FF_DONTCARE, //不指定字體族*/
- L"微軟雅黑" //字體名
- );
- //創建靜態文本框控件
- labExample = CreateWindow(
- L"static", //靜態文本框的類名
- L"你好,歡迎來到C語言中文網" , //控件的文本
- WS_CHILD /*子窗口*/ | WS_VISIBLE /*創建時顯示*/ | WS_BORDER /*帶邊框*/,
- 60 /*X坐標*/, 60/*Y坐標*/, 150/*寬度*/, 100/*高度*/, hWnd/*父窗口句柄*/,
- (HMENU)1, //為控件指定一個唯一標識符
- hInst, //當前實例句柄
- NULL
- );
- //設置控件字體
- SendMessage(
- labExample, //欲設置字體的控件句柄
- WM_SETFONT, //消息名(消息類型)
- (WPARAM)hFont, //字體句柄
- NULL //傳空值即可
- );
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意繪圖代碼...
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- //請做好善后工作
- DeleteObject(hFont);//刪除創建的字體
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
運行效果:
如上設置字體的方法幾乎適用於所有的 Win32 標准控件。
