《WINDOWS程序设计》第四章关于TEXTOUT的小问题

请叫我千哥 2008-12-05 11:30:52
文章原文是这样说的:

您会发现常常需要显示格式化的数字跟简单的字符串。我在第二章讲到过,您不能使惯用的工具(可
爱的printf 函数)来完成这项工作,但是可以使用sprintf 和Windows 版的sprintf-wsprintf。这些函
数与printf 相似,只是把格式化字符串放到字符串中。然后,可以用TextOut 将字符串输出到显示器上。
非常方便的是,从sprintf 和wsprintf 传回的值就是字符串的长度。您可以将这个值传递给TextOut 作为
iLength 参数。下面的程序代码显示了wsprintf 与TextOut 的典型组合:
int iLength ;
TCHAR szBuffer [40] ;
其它行程序
iLength = wsprintf(szBuffer, TEXT("The sum of %i and %i is %i"),
iA, iB, iA + iB) ;
TextOut(hdc, x, y, szBuffer, iLength) ;
对于这样简单的情况,可以将nLength 的定义值与TextOut 放在同一条叙述中,从而无需定义iLength:
TextOut(hdc, x, y, szBuffer,
wsprintf(szBuffer, TEXT("The sum of %i and %i is %i"),
iA, iB, iA + iB)) ;
虽然这样子写起来不好看,但是功能与前者是一样的。
综合使用


问题1:
示例代码
iLength = wsprintf(szBuffer, TEXT("The sum of %i and %i is %i"),
iA, iB, iA + iB) ;
TextOut(hdc, x, y, szBuffer, iLength) ;

中的格式字符%i是什么意思?我翻了很多关于C语言的书,也没找到这个格式字符。

问题2:
示例程序SYSMETS1的WndProc函数在处理WM_PAINT消息时:

case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;

for (i = 0 ; i < NUMLINES ; i++)
{
TextOut (hdc, 0, cyChar * i,
sysmetrics[i].szLabel,
lstrlen (sysmetrics[i].szLabel)) ;

TextOut (hdc, 22 * cxCaps, cyChar * i,
sysmetrics[i].szDesc,
lstrlen (sysmetrics[i].szDesc)) ;

SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

TextOut (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].iIndex))) ;

SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;


其中的:


TextOut (hdc, 0, cyChar * i,
sysmetrics[i].szLabel,
lstrlen (sysmetrics[i].szLabel)) ;

TextOut (hdc, 22 * cxCaps, cyChar * i,
sysmetrics[i].szDesc,
lstrlen (sysmetrics[i].szDesc)) ;
为什么不采用wsprintf对所显示的字符串进行处理,就像后面

TextOut (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].iIndex))) ;
那样。


...全文
154 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
请叫我千哥 2008-12-08
  • 打赏
  • 举报
回复
恩。谢谢。
htzyhtzy 2008-12-08
  • 打赏
  • 举报
回复
wsprintf (szBuffer, TEXT ("%5d"), GetSystemMetrics (sysmetrics[i].iIndex))) ;

这里需要输出一个整数,这个整数需要调用GetSystemMetrics 在运行时确定。
所以要用wsprintf 格式化。

前面两个字符串在编译时就已经确定了。
一定要要格式化也行: wsprintf(szBuffer, TEXT ("%s"), TEXT ("Screen width in pixels"));


请叫我千哥 2008-12-05
  • 打赏
  • 举报
回复
非常感谢。请问第2个问题呢?是不是结构体成员sysmetrics[i].szDesc已经是格式化过的字符串,就不需要再wsprintf处理了?sysmetrics结构体定义如下:
struct
{
int iIndex ;
TCHAR * szLabel ;
TCHAR * szDesc ;
}
sysmetrics [] =
{
SM_CXSCREEN, TEXT ("SM_CXSCREEN"),
TEXT ("Screen width in pixels"),
SM_CYSCREEN, TEXT ("SM_CYSCREEN"),
TEXT ("Screen height in pixels"),
//后面省略
} ;
htzyhtzy 2008-12-05
  • 打赏
  • 举报
回复
问题1:
<<C语言参考手册>> : c89引入,转换i与d的输出等价
标准C语言提供i操作符,保持与fscanf的兼容性,在输出中能够识别,保证统一性,与d操作符一致。

我看了半天,好像就是说和 d 一样的.

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧