2012-11-20 28 views
3

我正在設計一個自定義窗口邊框,並將頂部位圖作爲拖拽條放置。這個工程,但是當我試圖拖動窗口,它把自己放在兩個不同的領域,並在兩者之間閃爍。這裏有一個視頻: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相同)。如果它們在可拖動區域內,則返回HTCAPTION。系統會自動爲您處理所有的拖動邏輯。

0

傳遞給WM_MOUSEMOVE的光標座標是相對於窗口位置。但是你不斷地改變窗口的位置與每個WM_MOUSEMOVE接收。

使用:: ClientToScreen()將座標轉換爲屏幕座標。