我正在VS 2019中制作一个桌面应用程序,并尝试使用x
打印变量TextOut
。我知道问题不在于改变x变量的方式,因为它可以用OutputDebugString
正确输出。 TextOut
在做什么?
这是我的代码的相关部分:
case WM_PAINT:
{
float x = 1;
while (x < 100) {
x = x + 0.01;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
std::string s = std::to_string(x);
std::wstring stemp = s2ws(s);
LPCWSTR sw = stemp.c_str();
OutputDebugString(sw);
TextOut(hdc, x * 100, 150, sw, 3);
EndPaint(hWnd, &ps);
}
}
我希望数字逐渐增加(1.01、1.02、1.03等),并停止在100,但是在窗口中却停滞了1.0
。任何帮助将不胜感激。
答案 0 :(得分:3)
每条(Begin|End)Paint()
消息只需要呼叫WM_PAINT
一次。这是因为BeginPaint()
会将绘图区域裁剪为仅包括已无效的区域,然后验证窗口。因此,在您的示例中,由于裁剪区域为空,因此循环的第二次和后续迭代将无处绘制。
您需要将呼叫移至(Begin|End)Paint()
循环之外。
也无需手动将std::string
数据转换为std::wstring
,只需使用OutputDebugString()
和TextOut()
的ANSI版本并将其内部转换为Unicode即可。你。
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
float x = 1;
while (x < 100) {
x = x + 0.01;
std::string s = std::to_string(x);
OutputDebugStringA(s.c_str());
TextOutA(hdc, x * 100, 150, s.c_str(), 3);
}
EndPaint(hWnd, &ps);
break;
}
如果您确实要使用std::wstring
,则只需使用std::to_wstring()
而不是std::to_string()
:
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
float x = 1;
while (x < 100) {
x = x + 0.01;
std::wstring s = std::to_wstring(x);
OutputDebugStringW(s.c_str());
TextOutW(hdc, x * 100, 150, s.c_str(), 3);
}
EndPaint(hWnd, &ps);
break;
}