2016-11-17 62 views
0

出于某种原因,当我使用下面的代码试图输出在给定的WIN32窗口鼠标光标的位置:无法输出光标位置调试串(WIN32)

//Global Variable 
POINT cursorLocation; 

// Win32 Windowing subsystem code redacted 

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ 

cursorLocation.x = GET_X_LPARAM(lParam); 
cursorLocation.y = GET_Y_LPARAM(lParam); 

switch(message){ 
    case WM_MOUSEMOVE: 
    // mouse movement handle 
    OutputDebugString(cursorLocation.x + "," + cursorLocation.y); 
    OutputDebugString("\n"); 
    // WM_MOUSEMOVE break 
    break; 
} 
} 

现在,当我运行程序并移动鼠标,将以下文本记录到控制台:

较小的数据类型导致数据丢失。
如果这是故意的,你应该用适当的位掩码掩盖演员的来源。
例如:char c =(i & 0xFF);
以这种方式更改代码不会影响生成的优化代码的质量。

我甚至尝试类型转换传递给OutputDebugStringLONG变量,因为那是变量在POINT类的类型,没有什么区别。

有谁知道如何将值通过GET_X_LPARAMGET_Y_LPARAM传递到调试控制台? 谢谢。

回答

4

这不是一个字符串连接,但加入.x.y的指针的","

cursorLocation.x + "," + cursorLocation.y 

相反,尝试例如: -

char s[256]; 
sprintf_s(s, "%d,%d", cursorLocation.x, cursorLocation.y); 
OutputDebugStringA(s); // added 'A' after @IInspectable's comment, but 
         // using UNICODE and wchar_t might be better indeed      
+0

完美地工作。谢谢。我一直在语言之间来回切换,并没有注意到这是一个问题。 – xec86

+1

@ xec86:如果它对您有用,您正在使用错误的编译器设置。绝对没有理由使用ANSI字符编码。所有的Windows代码都应该使用Unicode编写,通过调用消耗或生成字符串的所有API的宽字符版本,从'char'切换到'wchar_t',并将所有字符串预设为'L'。一旦在命令行('/ DUNICODE/D_UNICODE')上定义了'UNICODE'和'_UNICODE'预处理器符号,编译器就会将您指向需要注意的位置。 – IInspectable

+0

感谢您的提示。我想知道为什么在我已经保存的代码片段中添加了前缀L's并没有工作。 – xec86

2

字符串连接不整数的工作。 尝试使用std::ostringstream

std::ostringstream out_stream; 
out_stream << cursorLocation.x << ", " << cursorLocation.y; 
OuputDebugString(out_stream.str().c_str());