2011-05-26 71 views
6

我需要實現它看起來像這樣鼠標拖動事件:處理鼠標拖動的正確方法是什麼?

class MouseDragEvent 
{ 
public: 
    uint m_btn; 
    uint m_x, m_y; 
    uint m_delta_x, m_delta_y; 
}; 

我想我會需要檢查WM_LBUTTONDOWN和WM_LBUTTONUP消息和手動查找在X和Y的變化。有沒有拖動信息或更好的方法?

回答

6

開始通過檢測WM_LBUTTONDOWN。記錄按下鼠標按鈕的起始座標。檢查WM_MOUSEMOVE,並且當鼠標移動到由GetSystemParameters(SM_CXDRAG)GetSystemParameters(SM_CYDRAG)確定的矩形外部時,使用SetCapture捕獲鼠標。此時繼續回覆WM_MOUSEMOVE並檢查WM_LBUTTONUP。此時您可能想要更改鼠標光標。同時檢查WM_CAPTURECHANGED,這意味着拖動已被中止。拖動完成後,請致電ReleaseCapture

編輯:這個過程的大部分都可以通過DragDetect函數實現自動化。從WM_LBUTTONDOWN處理程序中調用此函數。

+0

你不能在'WM_LBUTTONDOWN'中調用'SetCapture'嗎?或者這是否會打破雙擊識別?事實上,我認爲你應該,否則拖動邊界附近(在SM_CXDRAG中)的邊界可能不起作用。 – 2011-05-26 20:26:20

+0

@本Voigt,我認爲你是對的。我不得不這樣做,我只是從記憶中工作。 – 2011-05-26 22:44:02

+0

WRT'DragDetect',這聽起來像一個模態消息循環。使用前要非常小心。 (即研究後果) – 2011-05-27 00:43:22

0

在Windows中有拖放式API(例如RegisterDragDrop),但涉及窗口和窗口(通常在不同的應用程序中),而不是座標。

如果您想處理delta-x和delta-y協調,那麼處理按鈕和按鈕消息是適當的。

相關問題