| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2833 人关注过本帖
标题:《WINDOWS程序设计》第四章的小问题
取消只看楼主 加入收藏
ncppk
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-7
收藏
 问题点数:0 回复次数:1 
《WINDOWS程序设计》第四章的小问题
文章原文是这样说的:

您会发现常常需要显示格式化的数字跟简单的字符串。我在第二章讲到过,您不能使惯用的工具(可
爱的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))) ;
那样。
搜索更多相关主题的帖子: 程序设计 WINDOWS 
2008-12-07 00:43
ncppk
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-12-7
收藏
得分:0 
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"),
    //后面省略
    } ;
2008-12-07 00:43
快速回复:《WINDOWS程序设计》第四章的小问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027957 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved