2016-11-17 7 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);
Изменение кода таким образом не повлияет на качество получаемого оптимизированного кода.

Я даже попытался типажей переменные, передаваемые OutputDebugString в LONG, потому что это тип переменных в POINT классе, и не было никакой разницы.

Кто-нибудь знает, как получить значения, прошедшие через GET_X_LPARAM и GET_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'. Ваш компилятор укажет на нужные вам места, как только вы определите символы препроцессора UNICODE и '_UNICODE' в командной строке ('/DUNICODE/D_UNICODE'). – IInspectable

+0

Спасибо за подсказку. Мне было интересно, почему предыдущие L, которые у меня были в некоторых фрагментах кода, которые я сохранил, не работали. – xec86

2

Объединение строк не работает с целыми числами. Попробуйте использовать std::ostringstream:

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