关于文本的输出
在如何自己编写文本控件时,有关于如何展开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倍的区别如图: