2016-11-17 3 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);
이 방법으로 코드를 변경해도 결과 최적화 코드의 품질에는 영향을 미치지 않습니다.

POINT 클래스의 변수의 유형과 차이가 없기 때문에 나는 심지어하는 LONGOutputDebugString에 전달 된 변수를 타입 캐스팅했습니다.

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 코드는 유니 코드를 사용하여 작성해야하며, 문자열을 사용하거나 생성하는 모든 API의 와이드 문자 버전을 호출하고,'char'에서'wchar_t'로 전환하고, 모든 문자열 리터럴을'L'로 시작해야합니다. 커맨드 라인 ('/ DUNICODE/D_UNICODE')에'UNICODE'와'_UNICODE' 전처리 기 심볼을 정의하면 컴파일러는주의가 필요한 위치를 알려줍니다. – IInspectable

+0

팁 주셔서 감사. 나는 내가 구한 일부 코드 단편에서 앞에 붙어 있던 L이 왜 작동하지 않는지 궁금해했다. – xec86

2

문자열 연결이 정수 작동하지 않습니다 : 예컨대보십시오. std::ostringstream을 사용해보세요 :

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