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

在如何自己編寫文本控件時,有關(guān)于如何展開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       //展開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


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

 

TabbedTextOut

功能:

1將一個字符串寫到指定位置。

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

 

函數(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   字符串開始點的x坐標(biāo)(邏輯單位)。

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

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

nCount 字符數(shù)。

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

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

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

 

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

 

注:

【1】       如果nTabPositions值為0,且lpnTabStopPositions值位NULL,那么制表符會按平均字符寬度的8位來擴展。

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

【3】       nTabOrigin參數(shù)允許一個應(yīng)用程序為一行多次調(diào)用TabbedTextOut。如果應(yīng)用程序多次調(diào)用TabbedTextOutnTabOrigin每次都設(shè)置相同的值,則此函數(shù)在相對于nTabOrigin指定的位置處展開所有的制表符。

 

知識補充:

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

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

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

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

因為編輯器以行位模型,當(dāng)然是從一行的最左端開始。制表位數(shù)組值一個等于字體寬度的4倍。

 

摘自《windows編程》的解釋

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

 

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

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

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

 

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