Swprintf不转换值

swprintf not converting values

本文关键字:转换 Swprintf      更新时间:2023-10-16

我试图使用该函数作为在Win32应用程序中显示鼠标的X和Y值的方法。它替换了x的值,但是对于y,它将其设为0。我不知道为什么,我在应用程序期间设置了一个断点。Y不为0

编辑我将数据类型更改为int,由于某种原因,它现在可以工作了。我最初在long long中使用它,因为我处理输入的方式不同,而函数需要这种数据类型。我忘了换回去了。我不太确定为什么它没有工作与长长虽然。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static long long x = -1, y = -1;
switch (message)
{
case WM_MOUSEMOVE:
    {
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        InvalidateRect(hWnd, 0, TRUE);
        break;
    }
case WM_COMMAND:
    wmId    = LOWORD(lParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        break;
    case IDM_EXIT:
        DestroyWindow(hWnd);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);
        RECT rect;
        rect.left = x + 20;
        rect.top = y - 20;
        rect.right = x + 200;
        rect.bottom = y + 200;
        wchar_t displayMessage[100];
        swprintf(displayMessage, 100, L"(%d, %d)", x, y);
        DrawText(hdc, displayMessage, -1, &rect, NULL);
        EndPaint(hWnd, &ps);
        break;
    }
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

您忘记将缓冲区长度作为第二个参数,请参阅文档。

wchar_t displayMessage[100];
swprintf(displayMessage, 100, L"(%d, %d)", x, y);

更新:使用%lld long long

%d不是long long的正确标识符。

如果您坚持使用C语言swprintf,则将变量更改为int。或者使用%lld。或者按照下面的方式进行转换。

swprintf(displayMessage, 100, L"(%d, %d)", (int)x, (int)y);
编辑:

如果你不喜欢C语言,你不必在这个上下文中使用它。

无论使用什么整数类型,这都可以工作。

    std::wstringstream stream;
    stream << L"(" << x << L", " << y << L")";
    DrawText(hdc, stream.str().c_str(), -1, &rect, NULL);