使用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++的函数难道就无效了吗?

解决方案 »

  1.   


    你没有修改代码把:修改了代码 另当别论。反正我是编译了,可以通过,运行也可以。
    就是无法显示第3行TextOut(hdc,30*cxChar+40*cxChar,cyChar*i, szBuffer,_stprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex)));    
                SetTextAlign(hdc,TA_LEFT);这样无法显示
      

  2.   

    字符集编码设置不一致造成的我这没VC6
    在工程属性找到预处理器定义,删掉UNICODE;
    或者先关闭VC,先去掉SysMets1.dsp只读属性,用记事本打开SysMets1.dsp,搜索/D "UNICODE",删掉保存
      

  3.   

    UNICODE和_UNICODE(前面有下划线)应该是配对出现的
    或者在预处理器定义里加上_UNICODE;
    SysMets1.dsp文件里加上/D "_UNICODE"