具有变量的TextOut函数未更新

时间:2019-04-15 20:27:25

标签: c++ winapi

我正在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。任何帮助将不胜感激。

1 个答案:

答案 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;
}