關于文本的輸出

在如何自己編寫文本控件時,有關于如何展開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       //容納單行文本矩形區域
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


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

 

TabbedTextOut

功能:

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

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

 

函數原型:

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

 

參數意義:

Hdc :設備環境句柄。

X   字符串開始點的x坐標(邏輯單位)。

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

lpString:緩沖區指針。

nCount 字符數。

nTabPositions:指定制表位位置數組的值的個數。

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

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

 

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

 

注:

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

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

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

 

知識補充:

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

第六個參數為nTabPosition = 1

第七個參數為lpnTabStopPositions = tab = 4*font_width

第八個參數位nTabOrigin = line_rect.left

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

 

摘自《windows編程》的解釋

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

 

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

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

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

 

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