先上代码及输出结果:

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的理解

 

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则代表所设制表位宽度从什么地方开始计算。通常保持与输出字符串开始的点的横坐标一致。 

怎么理解这个数组所设置的制表位的宽度呢?是不是代表输出的字符串中各个子字符串之间的距离呢?答案是否定的!!!

下面的图示直观反映它的真正含义:

关于CDC::TabbedTextOut的理解

由上图所示:设置的制表位值代表的是从指定开始的位置(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;

……

以此类推。程序输出结果如下图:

关于CDC::TabbedTextOut的理解

与前面的输出结果相比:由于计算制表位值的开始点由100像素移到了0,而字符串输出又是从第100个像素开始的,这就造成在“姓名”之前的空白占了100个像素,导致“姓名”与“年龄”之间的空白宽度大大缩小,而年龄到爱好等字符串之间的距离保持不变,没有受到影响。这个变化主要是宽度值是“累计计算”的结果。

这是我的初步理解!

 

 

 

 

 

 

 

相关文章: