在 Windows 程式設計中,處理鼠標滾輪事件是常見需求。許多開發者在閱讀《Windows 程式設計》等經典書籍時,對 OnMouseWheel(UINT nFlags, short zDelta, CPoint point) 中的 zDelta 參數產生疑惑:書籍指出 zDelta 等於 WHEEL_DELTA(值為 120),代表滾輪向前旋轉一個槽口;若滾動 5 個槽口,則收到 5 個 WM_MOUSEWHEEL 消息,每個消息的 zDelta 皆為 WHEEL_DELTA。這樣看來,zDelta 似乎成了常數,但 MSDN 卻說:「The zDelta value is expressed in multiples or divisions of WHEEL_DELTA, which is 120.」,這該如何理解?
zDelta 表示旋轉距離與方向,以 WHEEL_DELTA 的倍數表達。
雖然標準鼠標每個槽口固定發送 120,但高精度滾輪(如部分觸控板、高端滑鼠)可發送更小的增量(如 40、60),此時 zDelta 便會是 WHEEL_DELTA 的分數倍數。因此,zDelta 並非恆定常數,而是攜帶具體旋轉量的變量。
void CMyView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// 累積 zDelta,直到達到 WHEEL_DELTA 再執行一次滾動邏輯
m_accumulatedDelta += zDelta;
if (abs(m_accumulatedDelta) >= WHEEL_DELTA) {
int scrollLines = m_accumulatedDelta / WHEEL_DELTA;
// 執行滾動 scrollLines 行
m_accumulatedDelta %= WHEEL_DELTA;
}
CView::OnMouseWheel(nFlags, zDelta, pt);
}
這樣即可同時支援傳統鼠標與高精度滾輪設備。
zDelta 的設計初衷是提供跨裝置一致的滾動體驗:以 120 為基準單位,允許硬體廠商發送更細緻的增量。開發者應累積處理 zDelta,而非假設其恆為 ±120。