關(guān)于文本的輸出
在如何自己編寫文本控件時(shí),有關(guān)于如何展開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
//容納單行文本矩形區(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
要明白他的意思才能在以后的編寫擴(kuò)展功能才能得心應(yīng)手。首先要明白一個(gè)函數(shù)。
TabbedTextOut
功能:
1將一個(gè)字符串寫到指定位置。
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: 字符串開始點(diǎn)的x坐標(biāo)(邏輯單位)。
Y: 字符串開始點(diǎn)的y坐標(biāo)(邏輯單位)。
lpString:緩沖區(qū)指針。
nCount: 字符數(shù)。
nTabPositions:指定制表位位置數(shù)組的值的個(gè)數(shù)。
lpnTabStopPositions:數(shù)組,包含制表位位置(邏輯單位)。必須按照升序保存。
nTabOrigin:指定制表符展開的開始位置的x坐標(biāo)(邏輯單位)。
返回值:字符串的尺寸,高位字表示高度,低位表示寬度。
注:
【1】 如果nTabPositions值為0,且lpnTabStopPositions值位NULL,那么制表符會按平均字符寬度的8位來擴(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ù)在相對于nTabOrigin指定的位置處展開所有的制表符。
知識補(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)然是從一行的最左端開始。制表位數(shù)組值一個(gè)等于字體寬度的4倍。
摘自《windows編程》的解釋:
TabbedTextOut的前五個(gè)參數(shù)與TextOut相同,第六個(gè)參數(shù)是跳位間隔數(shù),第七個(gè)是以圖素為單位的跳位間隔數(shù)組。
【1】 如果平均字符寬度是8個(gè)圖素,而您希望每5個(gè)字符加一個(gè)跳位間隔,則這個(gè)數(shù)組將包含40、80、120,按遞增順序依此類推。
【2】 如果第六個(gè)和第七個(gè)參數(shù)是0或NULL,則跳位間隔按每八個(gè)平均字符寬度設(shè)定。
【3】 如果第六個(gè)參數(shù)是1,則第七個(gè)參數(shù)指向一個(gè)整數(shù),表示跳位間隔重復(fù)增大的倍數(shù)(例如,如果第六個(gè)參數(shù)是1,并且第七個(gè)參數(shù)指向值為30的變量,則跳位間隔設(shè)定在30、60、90…圖素處)。最后一個(gè)參數(shù)給出了從跳位間隔開始測量的邏輯x坐標(biāo),它與字符串的起始位置可能相同也可能不同。
編輯器的展開tab屬于【3】,增大倍數(shù)是4個(gè)字符寬度。4倍與8倍的區(qū)別如圖: