天天看點

Windows程式設計--(四)文本輸出

在擦除對話框之後,需要重畫的被對話框遮住的矩形區域,這個區域稱為「無效區域」或「更新區域」。正是顯示區域内無效區域的存在,才會讓Windows将一個WM_PAINT消息放在應用程式的消息隊列中。隻有在顯示區域的某一部分失效時,視窗才會接受WM_PAINT消息。

Windows内部為每個視窗儲存一個「繪圖資訊結構」,這個結構包含了包圍無效區域的最小矩形的坐标以及其它資訊,這個矩形就叫做「無效矩形」,有時也稱為「無效區域」。如果在視窗消息處理程式處理WM_PAINT消息之前顯示區域中的另一個區域變為無效,則Windows計算出一個包圍兩個區域的新的無效區域(以及一個新的無效矩形),并将這種變化後的資訊放在繪制資訊結構中。Windows不會将多個WM_PAINT消息都放在消息隊列中。

PAINTSTRUCT結構包含了應用程式用來繪制它所擁有的視窗客戶區所需要的資訊。PAINTSTRUCT的結構定義如下:

  當調用BeginPaint函數時, Windows将自動填充這個結構體中的成員相關屬性, 程式僅能使用前三個成員, 其他為Windows内部使用。 參數一HDC hdc即為裝置環境句柄, BeginPaint函數的傳回值也就是這裡的裝置環境句柄, 簡單來說就是先填充再傳回; 參數二fErase決定是否擦出客戶區背景, 如果為非零值則擦除背景,否則不擦除背景; 參數三rcPaint 通過指定客戶區左上角和右下角的坐标确定一個要繪制的矩形範圍, 即使需要更新的無效區域不是一個矩形, Windows也會把需要重繪的部分裁剪為一個矩形。

  如果你仍想重繪整個客戶區, 可以在BeginPaint函數之前調用InvalidateRect( hwnd, NULL, TRUE );使整個客戶區無效化。

以下将詳細地讨論這個函數。

第一個參數是裝置内容句柄,它既可以是GetDC的傳回值,也可以是在處理WM_PAINT消息時BeginPaint的傳回值。

psText參數是指向字元串的指針,iLength是字元串中字元的個數。如果psText指向Unicode字元串,則字元串中的位元組數就是iLength值的兩倍。字元串中不能包含任何ASCII控制字元(如回車、換行、制表或倒退),Windows會将這些控制字元顯示為實心塊。Text0ut不識别作為字元串結束标志的内容為零的位元組(對于Unicode,是一個短整數型态的0),而需要由nLength參數指明長度。

TextOut中的x和y定義顯示區域内字元串的開始位置,x是水準位置,y是垂直位置。字元串中第一個字元的左上角位于坐标點(x,y)。在内定的裝置内容中,原點(x和y均為0的點)是顯示區域的左上角。如果在TextOut中将x和y設為0,則将從顯示區域左上角開始輸出字元串。

裝置内容還定義了在您呼叫TextOut顯示文字時Windows使用的字型。内定字型為「系統字型」,或用Windows表頭檔案中的辨別符,即SYSTEM_FONT。系統字型是Windows用來在标題列、菜單和對話框中顯示字元串的内定字型。

GetTextMetrics需要的TEXTMETRIC型态的結構:

總共20個字段,我們隻關心前7個。預設的映射模式為MM_TEXT

TextOut的兩種運用,将上面代碼的WM_PAINT部分替換即可。

第一種

第二種:

在switch前面定義一個結構變量tm

tmHeight,它是tmAscent和tmDescent的和。這兩個值表示了基準線上下字元的最大縱向高度。「間距」(leading)指列印機在兩行文字間插入的空間。在TEXTMETRIC結構中,内部的間距包括在tmAscent中(是以也在tmHeight中),并且它經常是重音符号出現的地方。tmInternalLeading字段可被設成0,在這種情況下,加重音的字母會稍稍縮短以便容納重音符号。

字段tmExternalLeading,它是字型設計者建議加在橫向字元之間的空間大小。

TEXTMETRICS結構包含有描述字元寬度的兩個字段,即tmAveCharWidth(小寫字母權重平均寬度)和tmMaxCharWidth(字型中最寬字元的寬度)。

Windows程式設計--(四)文本輸出
Windows程式設計--(四)文本輸出
Windows程式設計--(四)文本輸出

 但是上面的最後一個資訊,顯示在最後一頁,可以将最後一個資訊顯示在最後一頁的最後一行。

Windows程式設計--(四)文本輸出
Windows程式設計--(四)文本輸出

View Code

Windows程式設計--(四)文本輸出

繼續閱讀