2012-11-20 1 views
3

저는 사용자 정의 윈도우 경계를 디자인하고 있는데, 상단에 드래그 바 (drag bar)로 비트 맵을 넣습니다. 이 작동하지만, 나는 창을 끌려고 할 때, 그것은 두 개의 서로 다른 영역에 배치하고 둘 사이의 깜박임. 다음 비디오는 다음과 같습니다 창이 깜박이면 C++ 드래그 가능한 경계선없는 윈도우 문제

http://dl.dropbox.com/u/85700751/capture-1.avi

, 난 (어떤 이유로 내 커서를 표시하지 않습니다) 드래그하기 위해 노력하고있어. 드래그 코드는 다음과 같습니다.

case WM_LBUTTONDOWN: { 
    int posX = LOWORD(lParam); 
    int posY = HIWORD(lParam); 
    if((isDragging==false)&&(posX>4)&&(posX<470)&&(posY>4)&&(posY<24)) 
     { 
      isDragging = true; 
      ClipCursor(rect); 
      oldCursorX = posX; 
      oldCursorY = posY; 
     } 
    } 
    break; 
case WM_LBUTTONUP: { 
    isDragging = false; 
    ClipCursor(NULL); 
    } 
    break; 
case WM_MOUSEMOVE: { 
     if(isDragging) { 
      SetWindowPos(hWnd, NULL, LOWORD(lParam)-oldCursorX, HIWORD(lParam)-oldCursorY, 500, 500, NULL); 
     } 
    } 
    break; 

답변

5

일반적으로 WM_NCHITTEST에 다시 보내는 것이 가장 쉽습니다. 그 메시지에 대해, LPARAM은 마우스 히트 X와 Y 좌표를 가질 것입니다 (WM_LBUTTONDOWN과 동일). 그들이 당신의 draggable 영역 내에 있다면 그냥 HTCAPTION을 반환합니다. 그러면 시스템이 자동으로 모든 드래그 논리를 처리합니다.

0

WM_MOUSEMOVE에 전달 된 커서 좌표는 창 위치를 기준으로합니다. 하지만 WM_MOUSEMOVE를 수신 할 때마다 창 위치가 계속 변경됩니다.

:: ClientToScreen()을 사용하여 좌표를 화면 좌표로 변환하십시오.

관련 문제