關(guān)于文本的輸出

在如何自己編寫(xiě)文本控件時(shí),有關(guān)于如何展開(kāi)Tab的具體做法:

 1void TextView::PaintLine(HDC hdc,int line_no)
 2
 3{
 4
 5       int length = document->GetLineLength(line_no + start_line_no);
 6
 7       char *buffer = new char[length];
 8
 9       document->GetLineBuffer(buffer,line_no + start_line_no);
10
11       //容納單行文本矩形區(qū)域
12
13       RECT line_rect;
14
15       GetClientRect(tv_hwnd,&line_rect);
16
17       line_rect.top = line_no*(font_height + font_extra);
18
19       line_rect.bottom = line_rect.top + font_height + font_extra;
20
21       line_rect.left -= start_column_no*5;
22
23       //展開(kāi)Tab字符
24
25       int tab = 4*font_width;
26
27       int width = TabbedTextOut(hdc,line_rect.left,line_rect.top,buffer,length,1,&tab,line_rect.left);//輸出文字
28
29       line_rect.left = LOWORD(width);
30
31       ExtTextOut(hdc,0,0,ETO_OPAQUE,&line_rect,0,0,0);
32
33       delete []buffer;
34
35}

36


要明白他的意思才能在以后的編寫(xiě)擴(kuò)展功能才能得心應(yīng)手。首先要明白一個(gè)函數(shù)。

 

TabbedTextOut

功能:

1將一個(gè)字符串寫(xiě)到指定位置。

2并按制表位位置數(shù)組里的值展開(kāi)制表符。

 

函數(shù)原型:

LONG TabbedTextOut(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, LPINT lpn TabStopPositions, int nTabOrigin)

 

參數(shù)意義:

Hdc :設(shè)備環(huán)境句柄。

X   字符串開(kāi)始點(diǎn)的x坐標(biāo)(邏輯單位)。

Y   字符串開(kāi)始點(diǎn)的y坐標(biāo)(邏輯單位)。

lpString:緩沖區(qū)指針。

nCount 字符數(shù)。

nTabPositions:指定制表位位置數(shù)組的值的個(gè)數(shù)。

lpnTabStopPositions:數(shù)組,包含制表位位置(邏輯單位)。必須按照升序保存。

nTabOrigin:指定制表符展開(kāi)的開(kāi)始位置的x坐標(biāo)(邏輯單位)。

 

返回值:字符串的尺寸,高位字表示高度,低位表示寬度。

 

注:

【1】       如果nTabPositions值為0,且lpnTabStopPositions值位NULL,那么制表符會(huì)按平均字符寬度的8位來(lái)擴(kuò)展。

【2】       如果lpnTabStopPositions數(shù)組包含一個(gè)以上的話,則制表位被設(shè)為數(shù)組里的每一個(gè)值,共為lpnTabStopPositions個(gè)。

【3】       nTabOrigin參數(shù)允許一個(gè)應(yīng)用程序?yàn)橐恍卸啻握{(diào)用TabbedTextOut。如果應(yīng)用程序多次調(diào)用TabbedTextOut,nTabOrigin每次都設(shè)置相同的值,則此函數(shù)在相對(duì)于nTabOrigin指定的位置處展開(kāi)所有的制表符。

 

知識(shí)補(bǔ)充:

TabbedTextOut(hdc,line_rect.left,line_rect.top,buffer,length,1,&tab,line_rect.left);

第六個(gè)參數(shù)為nTabPosition = 1

第七個(gè)參數(shù)為lpnTabStopPositions = tab = 4*font_width

第八個(gè)參數(shù)位nTabOrigin = line_rect.left

因?yàn)榫庉嬈饕孕形荒P?,?dāng)然是從一行的最左端開(kāi)始。制表位數(shù)組值一個(gè)等于字體寬度的4倍。

 

摘自《windows編程》的解釋

TabbedTextOut的前五個(gè)參數(shù)與TextOut相同,第六個(gè)參數(shù)是跳位間隔數(shù),第七個(gè)是以圖素為單位的跳位間隔數(shù)組。

 

1  如果平均字符寬度是8個(gè)圖素,而您希望每5個(gè)字符加一個(gè)跳位間隔,則這個(gè)數(shù)組將包含40、80120,按遞增順序依此類(lèi)推。

【2】       如果第六個(gè)和第七個(gè)參數(shù)是0NULL,則跳位間隔按每八個(gè)平均字符寬度設(shè)定。

【3】       如果第六個(gè)參數(shù)是1,則第七個(gè)參數(shù)指向一個(gè)整數(shù),表示跳位間隔重復(fù)增大的倍數(shù)(例如,如果第六個(gè)參數(shù)是1,并且第七個(gè)參數(shù)指向值為30的變量,則跳位間隔設(shè)定在30、6090…圖素處)。最后一個(gè)參數(shù)給出了從跳位間隔開(kāi)始測(cè)量的邏輯x坐標(biāo),它與字符串的起始位置可能相同也可能不同。

 

編輯器的展開(kāi)tab屬于【3】,增大倍數(shù)是4個(gè)字符寬度。4倍與8倍的區(qū)別如圖: