使用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++的函数难道就无效了吗?
{
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++的函数难道就无效了吗?
解决方案 »
- 忍了很久很久一个问题啦,很简单的求指点
- InterlockedExchangeAdd函数疑问?
- 恳请用unicode字符编写过文件存取相关的大侠们帮助
- 可调整大小的对话框?????
- CPropertySheet中,切换Page时对CPropertySheet触发什么事件?
- 如何实现ODBC的自动设置?
- 有谁会做输入法呀??
- 请问这句话怎么理解!!
- 请是什么错误:fatal error C1010: unexpected end of file while looking for precompiled header directive
- 那里有“机械工业出版社出版的《时尚百例丛书》附赠光盘下载!
- 单文档FormView主窗口OnPaint函数的问题
- UDP传输时候的问题。在线等。急急急!
你没有修改代码把:修改了代码 另当别论。反正我是编译了,可以通过,运行也可以。
就是无法显示第3行TextOut(hdc,30*cxChar+40*cxChar,cyChar*i, szBuffer,_stprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex)));
SetTextAlign(hdc,TA_LEFT);这样无法显示
在工程属性找到预处理器定义,删掉UNICODE;
或者先关闭VC,先去掉SysMets1.dsp只读属性,用记事本打开SysMets1.dsp,搜索/D "UNICODE",删掉保存
或者在预处理器定义里加上_UNICODE;
SysMets1.dsp文件里加上/D "_UNICODE"