先上代码及输出结果:
void CMainWindow::OnPaint ()
{
//获取DC
CPaintDC dc(this);
CString str = _T("姓名\t年龄\t性别\t学历\t爱好");
int TabArray[4];
TabArray[0] = 160;
TabArray[1] = 250;
TabArray[2] = 340;
TabArray[3] = 430;
CPoint point(100, 100);
dc.TabbedTextOutW(point.x, point.y,
str,
sizeof(TabArray) / sizeof(TabArray[0]),
TabArray,
point.x);
}
CDC::TabbedTextOut
virtual CSize TabbedTextOut( int x, int y, LPCTSTR lpszString, int nCount, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin );
CSize TabbedTextOut( int x, int y, const CString& str, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin );
CDC::TabbedTextOut()函数是一个文本输出函数,它根据输出的字符串之间的制表符停止位数组值的设置,把一个字符串中包含的用制表符隔开的多个字符串,按指定的制表符宽度依次输出。主要用于格式化输出结果。
以上述的第二个函数原型为例:
其中,(1):x,y代表字符串输出的位置坐标。文章开头的代码中,x=100,y=100;
(2):str代表要输出的字符串。其中以\t制表符隔开不同的子字符串。前面的代码中,
CString str = _T("姓名\t年龄\t性别\t学历\t爱好");
(3): 其中,nTabPositions 和 lpnTabStopPositions两个参数是相关的。lpnTabStopPositions代表数组指针,nTabPositions 代表这个数组的长度(或大小)。在上述代码中:
lpnTabStopPositions就是TabArray[]数组,值分别为:
int TabArray[4];
TabArray[0] = 160;
TabArray[1] = 250;
TabArray[2] = 340;
TabArray[3] = 430;
nTabPositions 代表TabArray[]的长度,nTabPositions =sizeof(TabArray) / sizeof(TabArray[0]),值为4。
(4):nTabOrigin则代表所设制表位宽度从什么地方开始计算。通常保持与输出字符串开始的点的横坐标一致。
怎么理解这个数组所设置的制表位的宽度呢?是不是代表输出的字符串中各个子字符串之间的距离呢?答案是否定的!!!
下面的图示直观反映它的真正含义:
由上图所示:设置的制表位值代表的是从指定开始的位置(nTabOrigin 指定,通常与字符串输出开始的坐标点的横坐标相同)计算宽度值。
如上图中,TabArray[0]=160代表从坐标点(100,100)开始,输出的“姓名”的宽度,加上其后的空白宽度,到“年龄”之前一个像素为止,宽度为160.
TabArray[1]=250还是从坐标点(100,100)开始,到输出的“性别”之前的宽度。
后面以此类推……
TabArray[]中的每个宽度值,都是累计计算的,都从指定的横坐标nTabOrigin开始计算的(前述代码中nTabOrigin =x)。因此,后面的值总是要大于前面的值。输出的子字符串之间的:间隔=(设置的宽度值)-(子字符串的宽度)-(累计宽度值) 。如:
姓名与年龄之间的间隔=160 -(姓名)宽度-0(累计宽度)。
年龄与性别之间的间隔=250 -(年龄)宽度 -160(累计宽度)
……
明白了设置的制表宽度值的含义后,就能正确使用TabbedTextOut()函数了。
如果最后一个参数nTabOrigin 不是像上述代码中那样等于x(字符串输出的坐标点的横坐标),而是nTabOrigin =0。
TabArray[]中设置的宽度值又是怎样计算的呢?
其实道理是一样的,只不过制表位宽度值开始计算的参照位置由横坐标100变为横坐标为0而已。
其输出结果及相互之间的空白距离,应该如下:
100个像素+姓名+空白宽度(年龄之前)=160;
100个像素+姓名+空白宽度+年龄+空白宽度(性别之前)=250;
……
以此类推。程序输出结果如下图:
与前面的输出结果相比:由于计算制表位值的开始点由100像素移到了0,而字符串输出又是从第100个像素开始的,这就造成在“姓名”之前的空白占了100个像素,导致“姓名”与“年龄”之间的空白宽度大大缩小,而年龄到爱好等字符串之间的距离保持不变,没有受到影响。这个变化主要是宽度值是“累计计算”的结果。
这是我的初步理解!