關于文本的輸出
在如何自己編寫文本控件時,有關于如何展開Tab的具體做法:
1
void 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。如果應用程序多次調用TabbedTextOut,nTabOrigin每次都設置相同的值,則此函數在相對于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】 如果第六個和第七個參數是0或NULL,則跳位間隔按每八個平均字符寬度設定。
【3】 如果第六個參數是1,則第七個參數指向一個整數,表示跳位間隔重復增大的倍數(例如,如果第六個參數是1,并且第七個參數指向值為30的變量,則跳位間隔設定在30、60、90…圖素處)。最后一個參數給出了從跳位間隔開始測量的邏輯x坐標,它與字符串的起始位置可能相同也可能不同。
編輯器的展開tab屬于【3】,增大倍數是4個字符寬度。4倍與8倍的區別如圖: