I think by interpreting lpString, TabbedTextOut itself can figure out how many "\t"s there are and thus the sixth parameter nTabPositions and the seventh lpnTabStopPositions, which together indicate the number and the positions of the tabs in lpString, do not make any sense. Besides, for example, when I call TabbedTextOut the following way, int nTabStopPositions[] = { 105,110,120 }; TabbedTextOut(hdc, 100, 100, "aaa\tbbb\tccc", 11, 3, nTabStopPositions, 50); Supposing the map mode is MM_TEXT,and the char width is 5. TabbedTextOut will draw the string where it is 100 pixels to the left and 100 pixels to the top of the client area, breaking the string with tabs at 100+3*5 and 100+6*5+8( a tab equals 8 blanks ). This is the way I think how TabbedTextOut works, but it seems not working that way. Thus I don't understand how the last three parameters work. thank you