关于文本的输出

在如何自己编写文本控件时,有关于如何展开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个字符加一个跳位间隔,则这个数组将包含4080120,按递增顺序依此类推。

【2】       如果第六个和第七个参数是0NULL,则跳位间隔按每八个平均字符宽度设定。

【3】       如果第六个参数是1,则第七个参数指向一个整数,表示跳位间隔重复增大的倍数(例如,如果第六个参数是1,并且第七个参数指向值为30的变量,则跳位间隔设定在306090…图素处)。最后一个参数给出了从跳位间隔开始测量的逻辑x坐标,它与字符串的起始位置可能相同也可能不同。

 

编辑器的展开tab属于【3】,增大倍数是4个字符宽度。4倍与8倍的区别如图: