格式化一个整形就这么难吗?

bsnry 2012-12-17 04:57:22
使用c函数格式化字符串导致的问题

问题描述:TextOut的时候,格式花了一个整形。

采用的是c/c++里的函数,结果程序报废了。

_stprintf: sprintf, swprintf

注意 winwos也提供了一个api:wspintf.

别混淆

代码里是采用前者_stprintf。



LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar ;
HDC hdc ;
int i ;
PAINTSTRUCT ps ;
TCHAR szBuffer [10] ;
TEXTMETRIC tm ;

switch (message)
{
case WM_CREATE:
hdc = GetDC (hwnd) ;


hdc=GetDC(hwnd);

GetTextMetrics(hdc,&tm);

//字体平均宽度
cxChar=tm.tmAveCharWidth;
//字体平均高度
cyChar=tm.tmHeight+tm.tmExternalLeading;

ReleaseDC(hwnd,hdc);

return 0 ;


case WM_PAINT :


hdc = BeginPaint (hwnd, &ps) ;

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

//第1列

// TextOut(hdc,30*cxChar,cyChar*i,sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc));

//设置对数字对其

SetTextAlign(hdc,TA_RIGHT);


#ifdef _UNICODE
wmemset(szBuffer,0,10);
#else
memset(szBuffer,0,10);
#endif
TextOut(hdc,30*cxChar+40*cxChar,cyChar*i, szBuffer,_stprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex)));
SetTextAlign(hdc,TA_LEFT);
}
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}



一共输出3列,结果第3列无法求出。问了几个网友都无法搞定。


完整源码:
http://xa.ctfs.ftn.qq.com/ftn_handler/4dbf8a3cb19cf9aa10984c488f7c4f01cc963ca0c26a324c695e61a3f36ed0735c137a4bbb20d2fd4e634fc9a73a8c08f782be8c034fca44ab56dac96a6b82a2/?fname=SysMets1_33912.zip&k=20333534d0ec9dcc6db01f134339501c000753030700520b4c0104525414560b5352180c010e531e55020d51515c0650570a54516535626018407851114a531d1b5a453458&fr=00&&txf_fid=07dab53458b51dc9dcd0f6ea16a45c0d12b2a1a2&xffz=10827


windows程序这么霸气,c/c++的函数难道就无效了吗?
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
stjay 2012-12-17
  • 打赏
  • 举报
回复
UNICODE和_UNICODE(前面有下划线)应该是配对出现的 或者在预处理器定义里加上_UNICODE; SysMets1.dsp文件里加上/D "_UNICODE"
stjay 2012-12-17
  • 打赏
  • 举报
回复
字符集编码设置不一致造成的 我这没VC6 在工程属性找到预处理器定义,删掉UNICODE; 或者先关闭VC,先去掉SysMets1.dsp只读属性,用记事本打开SysMets1.dsp,搜索/D "UNICODE",删掉保存
bsnry 2012-12-17
  • 打赏
  • 举报
回复
引用 4 楼 happyparrot 的回复:
我没有修改啊,直接编译运行,一点问题也没有。
大哥,你发个运行的截图吧,谢谢啊。 别人说真的不行啊
快乐鹦鹉 2012-12-17
  • 打赏
  • 举报
回复
我没有修改啊,直接编译运行,一点问题也没有。
bsnry 2012-12-17
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
我用你的程序编译运行,一点问题都没有啊
你没有修改代码把: 修改了代码 另当别论。 反正我是编译了,可以通过,运行也可以。 就是无法显示第3行 TextOut(hdc,30*cxChar+40*cxChar,cyChar*i, szBuffer,_stprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex))); SetTextAlign(hdc,TA_LEFT); 这样无法显示
快乐鹦鹉 2012-12-17
  • 打赏
  • 举报
回复
我用你的程序编译运行,一点问题都没有啊
快乐鹦鹉 2012-12-17
  • 打赏
  • 举报
回复
错误现象是什么呢?程序直接退出?

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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