Download presentation
Presentation is loading. Please wait.
1
Visual C++ Windows Programming
第七章 字型與文字輸出
2
大綱 基本知識 字型的描述 多樣的文字輸出方式
3
基本知識 基本觀念 點陣字 Windows 把文字輸出當成是另一種繪圖動作,因此要顯示文字,我們關心兩件事情:
如何設定字型 如何把字串以特定字型輸出到螢幕上 點陣字 點陣字的構成方式很簡單,就是點矩陣。點陣字的特色是大小固定,但是放大時會有明顯的鋸齒。點陣字的優點是計算速度快,但缺點就是不能任意放大,而且也較浪費磁碟空間。
4
基本知識 (續) 向量字 向量字是由線條構成字體。向量字的優點就是可以任意放大縮小,但是缺點是速度較慢,同時字體比較呆板,沒有變化,比較難看。 TrueType TyueType 是 Microsoft 和 Apple 合作的產物,它可以算是向量字的下一代改良品。同樣地它需要耗費時間計算,產生字型,但是獨特的 hinting 技術使得 TrueType字型縮小顯示時一樣好看。TrueType另一項優點是它在螢幕上顯示的大小和列印出來的大小一致,外型神似,這對於桌上排版而言有很大的便利。
5
字型的描述 LOGFONT 結構 typedef struct tagLOGFONT { LONG lfHeight;
LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT;
6
字型的描述 (續) LOGFONT 結構 lfHeight:若為 0 則表示為預設值,否則其絕對值代表此字型的高度。
lfWidth:設定每一個字元的平均寬度。 lfEscapement:字元排列的角度,單位為 0.1度。 lfOrientation:指定字元本身旋轉的角度,單位為 0.1 度。 lfWeight:設定字體線條的厚度。理論上厚度可以從 1 到 1000 ( 0 為任意值,400 為正常厚度, 700 為粗體)。但實際上的結果仍然視字型是否支援那麼多種粗細度的選擇。 lfItalic:若為 0 則為正常體,若不為 0 則為斜體字。
7
字型的描述 (續) LOGFONT 結構 (續) lfUnderline:若為 0 則為正常體,若不為 0 則加上底線。
lfStrikeOut:若為 0 則為正常體,若不為 0 則加上刪除線。 lfCharSet:指定字集,和國別語文有關。 lfOutPrecision:指定字型的精確度。 lfClipPrecision:裁剪字元的方法。 lfQuality:字體的品質。 lfPitchAndFamily:選擇字體寬度的種類 (變動寬度或者固定寬度) 。 lfFaceName:字型的名稱。
8
多樣的文字輸出方式 BOOL CDC::TextOut(int x, int y, LPCTSTR lpszString, int nCount); BOOL CDC::TextOut(int x, int y, const CString &str); BOOL CDC::ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount, LPINT lpDxWidths); BOOL CDC::ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, const CString &str, LPINT lpDxWidths); int CDC::DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat); int CDC::DrawText(const CString &str, LPRECT lpRect, UINT nFormat); int CDC::TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin); int CDC::TabbedTextOut(int x, int y, const CString &str, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin);
9
#include <afxwin.h>
class CMyFrameWnd : public CFrameWnd { public: afx_msg void OnPaint() { CPaintDC paintDC(this); paintDC.TextOut(100, 20, "Hello World!"); paintDC.SetTextColor(RGB(255, 0, 0)); paintDC.DrawText("Hello World!", 12, CRect(100, 40, 200, 60), DT_LEFT); paintDC.SetTextColor(RGB(0, 255, 0)); paintDC.DrawText("Hello World!", 12, CRect(100, 60, 200, 80), DT_CENTER); paintDC.SetTextColor(RGB(0, 0, 255)); paintDC.DrawText("Hello World!", -1, CRect(100, 80, 200, 100), DT_RIGHT); paintDC.SetTextColor(RGB(128, 128, 128)); paintDC.DrawText("Hello &World!", -1, CRect(100, 100, 200, 120), DT_CENTER); } DECLARE_MESSAGE_MAP() } ;
10
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_PAINT() END_MESSAGE_MAP() class CMyApp : public CWinApp { public: CMyApp() : CWinApp("Hello World!") { } BOOL InitInstance() { CFrameWnd *MyFrame = new CMyFrameWnd; m_pMainWnd = MyFrame; MyFrame->Create(NULL, "Text Test!"); MyFrame->ShowWindow(SW_SHOW); return TRUE; } } ; CMyApp Text;
Similar presentations