我正在尝试使用该函数作为在Win32应用程序中显示鼠标的X和Y值的方法。它取代了x值,但对于y,它将其设置为零。我无法弄清楚为什么,我在应用程序中设置了一个断点。 Y不是0.
编辑 我将数据类型更改为int,由于某种原因,它现在正在工作。我最初在很长一段时间里都有它,因为我处理输入的方式不同,而且函数需要数据类型。我忘了改回来。我不太清楚为什么它长时间不起作用。
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;
}
答案 0 :(得分:1)
您忘记了缓冲区长度作为第二个参数see the documentation。
wchar_t displayMessage[100];
swprintf(displayMessage, 100, L"(%d, %d)", x, y);
更新:%lld
使用long long
。
答案 1 :(得分:0)
%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);