2013-03-15 3 views
-1

Win32 응용 프로그램에서 마우스의 X 및 Y 값을 표시하는 방법으로이 함수를 사용하려고합니다. x 값을 대체하지만 y 값은 0으로 설정합니다. 나는 이유를 알 수 없으며 응용 프로그램에서 중단 점을 설정했습니다. Y가 0이 아닙니다.swprintf 값을 변환하지 않습니다.

편집 데이터 형식을 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; 
} 

답변

1

두 번째 인수로 버퍼 길이를 잊어 버린 경우 see the documentation입니다.

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

업데이트 : long long에 대한 사용 %lld.

+0

코드를 변경했습니다. y는 여전히 0으로 반환됩니다. – Emrys90

+0

'displayMessage'의 값이 "(123, 0)"과 같은 것을 의미합니까? 'y'가 완전한 데이터인지 확인하십시오. 실제로는 0이 아닙니다. – Mikhail

+0

나는 그랬다. 실행 중에 값이 무엇인지 알기 위해 중단 점을 설정합니다. 0이 아닙니다. – Emrys90

0

%dlong 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); 
+0

아. 그것은 그것을 설명 할 것이다. x와 y가 왜 효과가 있었는지 아는 어떤 아이디어? – Emrys90

+0

@ Emrys90'x'도 항상 작동하지는 않습니다. 'x'와'y' 인자가 너무 크기 때문에'swprintf'는 첫 번째 숫자는'x'의 절반을, 두 번째 숫자는'x'의 나머지 절반을 보입니다. 'swprintf'는 타입 - 안전하지 않습니다. –

+0

int로 변경했습니다. 나는이 C 언어의 모든 것을 싫어하지만 대부분의 Win32 함수는 이러한 데이터 유형을 필요로합니다. 나는 그들에게 익숙하지 않아, 나는 항상 올바르게 이해하지 못한다. – Emrys90

관련 문제