2014-02-15 2 views
0

현재 저는 확대하거나 축소 할 수있는 게임 편집기를 만들고 있습니다. 마우스 휠을 위아래로 스크롤 할 수있는 문제가 있습니다. 두 스크롤을 모두 구현할 수 없습니다. 즉, 편집기 클래스에서 input->mouseWheelUp()을 호출하면 스크롤 업할 수 있습니다. 아래로 스크롤하면 더 이상 작동하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?마우스 휠만 위 또는 아래로 스크롤 할 수 있습니다.

가져 오기 마우스 휠 meesage

LRESULT Game::messageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    if (initialized) // do not process messages if not initialized 
    { 
     switch (msg) 
     { 
     case WM_MOUSEWHEEL:        
       input->mouseWheelIn(wParam); 
      return 0; 
     } 
    } 
    return DefWindowProc(hwnd, msg, wParam, lParam); // let Windows handle it 
} 

입력 클래스

void Input::mouseWheelIn(WPARAM wParam) 
{ 
    mouseWheel = GET_WHEEL_DELTA_WPARAM(wParam); 
} 

bool mouseWheelUp() 
{ 
    int wheel = mouseWheel; 
    mouseWheel = 0; 
    return wheel > 0; 
} 

bool mouseWheelDown() 
{ 
    int wheel = mouseWheel; 
    mouseWheel = 0; 
    return wheel < 0; 
} 

편집기 클래스

void Editor::update() 
{ 
    if (input->mouseWheelUp()) 
    { 
     zoom += 0.1f; 
    } 

    if (input->mouseWheelDown()) 
    { 
     zoom -= 0.1f; 
    } 
} 

답변

1

편집기의 update 방법을 보면, 첫 번째 호출은 재설정하는 mouseWheelUp이다 내부적으로 캐시 된 마우스 휠 이벤트 값을 0으로 설정합니다. 초에 ond를 mouseWheelDown으로 호출하면 값은 0이되고 따라서 해당 메서드의 반환 결과는 항상 false입니다.

이 문제는 다르게 처리해야합니다. 예를 들어 마우스 휠 위 또는 아래 이벤트를 나타내는 상수 또는 열거 형에 일종의 매핑을 도입 할 수 있습니다. 또는 원시 수신 이벤트 값 대신 업데이트 메소드를 처리 할 수 ​​있습니다. 델타 값은 마우스 휠을 얼마나 돌리 느냐에 따라 다소 차이가있을 수 있으므로 아마 더 좋은 방법 일 것입니다. 확대/축소 값을 더 크게 또는 더 작게 변경하려면 델타를 고려해야합니다.

1
case WM_MOUSEWHEEL: 
     if ((short)HIWORD(msg.wParam) < 0) 
     { 
      zoom-=3; 
     } 
     else 
     { 
      zoom+=3; 
     } 
     break; 

마우스 휠 스크롤을 사용하는 예가 간단하고 매끈합니다.

관련 문제