我需要實現它看起來像這樣鼠標拖動事件:處理鼠標拖動的正確方法是什麼?
class MouseDragEvent
{
public:
uint m_btn;
uint m_x, m_y;
uint m_delta_x, m_delta_y;
};
我想我會需要檢查WM_LBUTTONDOWN和WM_LBUTTONUP消息和手動查找在X和Y的變化。有沒有拖動信息或更好的方法?
我需要實現它看起來像這樣鼠標拖動事件:處理鼠標拖動的正確方法是什麼?
class MouseDragEvent
{
public:
uint m_btn;
uint m_x, m_y;
uint m_delta_x, m_delta_y;
};
我想我會需要檢查WM_LBUTTONDOWN和WM_LBUTTONUP消息和手動查找在X和Y的變化。有沒有拖動信息或更好的方法?
開始通過檢測WM_LBUTTONDOWN
。記錄按下鼠標按鈕的起始座標。檢查WM_MOUSEMOVE
,並且當鼠標移動到由GetSystemParameters(SM_CXDRAG)
和GetSystemParameters(SM_CYDRAG)
確定的矩形外部時,使用SetCapture
捕獲鼠標。此時繼續回覆WM_MOUSEMOVE
並檢查WM_LBUTTONUP
。此時您可能想要更改鼠標光標。同時檢查WM_CAPTURECHANGED
,這意味着拖動已被中止。拖動完成後,請致電ReleaseCapture
。
編輯:這個過程的大部分都可以通過DragDetect
函數實現自動化。從WM_LBUTTONDOWN處理程序中調用此函數。
在Windows中有拖放式API(例如RegisterDragDrop
),但涉及窗口和窗口(通常在不同的應用程序中),而不是座標。
如果您想處理delta-x和delta-y協調,那麼處理按鈕和按鈕消息是適當的。
你不能在'WM_LBUTTONDOWN'中調用'SetCapture'嗎?或者這是否會打破雙擊識別?事實上,我認爲你應該,否則拖動邊界附近(在SM_CXDRAG中)的邊界可能不起作用。 – 2011-05-26 20:26:20
@本Voigt,我認爲你是對的。我不得不這樣做,我只是從記憶中工作。 – 2011-05-26 22:44:02
WRT'DragDetect',這聽起來像一個模態消息循環。使用前要非常小心。 (即研究後果) – 2011-05-27 00:43:22