第二章 1 繪製文字

2021-08-25 01:32:50 字數 3983 閱讀 5591

在上一節中給出了如下方法繪製文字

drawtext (hdc, text ("hello windows ce!"), -1, &rect, dt_center | dt_vcenter | dt_singleline);

drawtext是乙個相當高階的函式,允許由程式顯示文字,而由windows處理大部分細節。drawtext的頭幾個引數幾乎是不言而喻,很直觀。當前正在使用的裝置環境控制代碼被傳入,同時傳入的還有被text巨集包圍的用來顯示的文字,宣告成unicode字串是為了符合windows ce的需要。第三個引數是要輸出的字元個數,當為-1,則表示傳入的是以null為終止符的字串並由windows計算其長度。

第四個引數是乙個指向rect結構的指標,為文字規定了格式化矩形。drawtext用該矩形作為文字格式化輸出的基礎。文字如何格式化取決於函式的最後乙個引數--格式化標誌位。這些標誌位指定文字如何被放在格式化的矩形裡。在指定了dt_calcrect標誌位的情況下,由drawtext來計算需要輸出的文字的尺寸。drawtext甚至用自動計算出的行中斷(line break)來將文字格式化多行。在helloce的情況裡,標誌位規定文字應該水平居中(dt_center)和垂直居中(dt_vcenter)。dt_vcenter標誌只在單行文字的情況下有效,所以最後乙個標誌位dt_singleline規定如果矩形寬度不足以顯示整個字串時,文字不應該折成多行。

畫文字的另乙個方法就是使用下面的函式:

bool exttextout (hdc hdc, int x, int y, uint fuoptions,

const rect *lprc, lpctstr lpstring,

uint cbcount, const int *lpdx);

exttextout函式同drawtext相比有一些優勢。首先,exttextout畫單行文字往往更快一些。其次,文字並不在矩形裡格式化,而是以傳入的x、y座標作為文字繪製的起始座標。通常,該點是矩形的左上角座標,但它可以隨著dc中文字對齊方式來改變。傳入的rect引數用做剪下矩形,如果背景模式是opaque,則背景顏色的區域被繪製。該矩形引數可以是null,表示不需要剪下或者opaquing(不透明化)。接下來的兩個引數是文字及字元個數。最後乙個引數允許應用程式指定相鄰字元之間的水平距離。

windows ce與其它版本的windows不同的地方在於只有這兩個文字繪製函式用於顯示文字。通過使用drawtext或extextout,您可以模擬textout 和 tabbedtextout等其它版本windows裡文字函式所能做的大部分操作。這是windows ce同windows早期版本不同的地方之一,通過犧牲向後相容性來獲得乙個更小的作業系統。

裝置環境屬性

關於helloce中用的drawtext,我還沒有提到的是當顯示文字時程式對dc配置做的大量假設。在windows裝置環境上繪製需要很多引數,例如前景色和背景色、文字如何繪製在背景上以及文字的字型等。每次繪製時並不是指定所有這些引數,裝置環境保持當前設定,也就是屬性,每次在繪製裝置變數上繪製時都使用這些屬性。

前景色和背景色

文字屬性最顯而易見的是前景色和背景色。settextcolor 和gettextcolor允許程式設定和獲取當前顏色。這兩個函式在windwos ce裝置支援的灰度級螢幕和彩色螢幕上都可以執行的很好。

使用前面提到的getdevicecaps函式,可以確定裝置支援多少顏色。該函式原型如下:

int getdevicecaps (hdc hdc, int nindex);

您需要被查詢的dc的控制代碼,因為不同的dc有不同的內容。例如,印表機dc就不同於顯示器dc。第二個引數指出要查詢的內容。在返回裝置上可用顏色時,當裝置支援256色或更少顏色時,numcolors返回支援的顏色數量。當超過256時,numcolors對應的返回值為-1,用bitspixel可以返回顏色,此時返回的是每個畫素所用的位(bit)數。通過將bitspixel的返回值左移動一位,可以將這個值轉換為顏色數,**示例如下:

nnumcolors = getdevicecaps (hdc, numcolors);

if (nnumcolors == -1)

nnumcolors = 1 << getdevicecaps (hdc, bitspixel);

文字對齊方式

當用exttextout顯示文字時,系統用dc的文字對齊方式來決定在**繪製文字。通過settextalign 函式,文字可以水平和垂直對齊。

settextalign 如下:

uint winapi settextalign (hdc hdc, int fmode);

傳給fmode的對齊標方式標誌位如下所示:

ta_left 文字左邊緣與控制點對齊(控制點解釋見後)

ta_right文字右邊緣與控制點對齊

ta_top文字頂部與控制點對齊

ta_center文字以控制點為中心水平居中

ta_bottom文字底部邊緣與控制點對齊

ta_baseline文字基線與控制點對齊

ta_noupdatecp在呼叫exttextout後,dc的當前點並不更新

ta_updatecp在呼叫exttextout後,dc的當前點更新

上面描述中提到的控制點指的是傳給exttextout的x、y座標。對settextalign的每次呼叫,垂直對齊標誌和水平對齊標誌可以組合在一起。

繪製模式

影響文字輸出的另乙個屬性是背景模式。當字母在裝置環境上繪製時,系統使用前景色繪製字母自身。字母之間的空間則是另一回事。如果背景模式設定為不透明,則使用當前背景色來繪製該空間。但如果背景模式設定為透明,字母之間的空間保持文字繪製之前的狀態。雖然這可能不像是乙個大的區別,但設想乙個使用圖畫或者來填充的視窗背景。如果文字在頂部輸出,背景模式設定為不透明,文字周圍的區域會被填充,背景色會填充在上。如果背景模式是透明,文字在上看起來就像文字原本就在上一樣,會在文字的字母之間顯示出來。

lresult dopaintmain (hwnd hwnd, uint wmsg, wparam wparam,

lparam lparam) ;

getclientrect (hwnd, &rectcli);

hdc = beginpaint (hwnd, &ps);

// get the height and length of the string.

drawtext (hdc, text ("hello windows ce"), -1, &rect,

dt_calcrect | dt_center | dt_singleline);

cy = rect.bottom - rect.top + 5;

// draw black rectangle on right half of window.

hbrold = (hbrush)selectobject (hdc, getstockobject (black_brush));

rectangle (hdc, rectcli.left + (rectcli.right - rectcli.left) / 2,

rectcli.top, rectcli.right, rectcli.bottom);

selectobject (hdc, hbrold);

rectcli.bottom = rectcli.top + cy;

setbkmode (hdc, transparent);

for (i = 0; i < 4; i++)

setbkmode (hdc, opaque);

for (i = 0; i < 4; i++)

endpaint (hwnd, &ps);

return 0;

}demo的實質內容在onpaintmain函式裡。對drawtext的第一次呼叫並沒有在裝置環境上畫任何東西。相反,使用dt_calcrect標誌指示windows將文字串的矩形尺寸存在rect裡。該資訊用於計算字串的高度,並儲存在cy裡。接下來,在視窗的右側繪製了乙個黑色矩形。函式接下來用不同的前景色、背景色在透明和不透明模式下輸出了 同樣的字串。

字型

第二章 演算法分析(1)

在這一章,我們將討論 我們將使用下面四個定義 如果存在正常數c和n0使得當n n0時t n cf n 則記為t n o f n 如果存在正常數c和n0使得當n n0時t n cg n 則記為t n omega f n t n h n 當且僅當t n o h n 和t n h n 如果對所有的常數c存...

第二章 詞法分析1

前端處理的是和源語言相關,後端處理的是和體系結構和目標機相關的程式。讀入字元流後,詞法分析器對整個字元流進行切分,按照它們是關鍵字 識別符號 標點符號 字串 整型數做乙個明確的劃分。每乙個if lparen等都是記號 單詞 結束會有乙個eof。不同的語言,列舉型別是有限的但不一定相同。lexeme是...

第二章 JSP互動(1)

第二章 jsp互動 jsp 內建物件 out用於向客戶輸出資料 request 請求用於處理客戶端請求的資料資訊 常用方法名稱 說明string getparameter string name 根據表單元件名稱獲取提交資料 string getparametervalues string name...