if (si.nPos != iVertPos) {
ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), NULL, NULL);
UpdateWindow(hwnd);
}
為何用 iVertPos - si.nPos 而非 si.nPos - iVertPos?若滾動條下移,si.nPos 增大,差值為負,ScrollWindow 的 cyChar * 負值 會向上滾動內容,這是否相反?
ScrollWindow(hwnd, dx, dy, ...) 中 dy > 0 向下滾動窗口內容(即內容向上移動),dy < 0 向上滾動窗口內容(內容向下移動)**。
iVertPos:處理滾動消息**前**的舊位置(已保存)。si.nPos:處理滾動消息**後**的新位置(用戶拖動/點擊後的目標位置)。si.nPos > iVertPos。dy 應為**負值**。iVertPos - si.nPos = 舊 - 新 = **負值** → 內容向上滾動 ✓si.nPos - iVertPos = 正值 → 內容向下滾動 → 顯示更靠前的行 ✗(與用戶意圖相反)。ScrollWindow(hwnd, cxChar * (iHorzPos - si.nPos), 0, NULL, NULL);
用戶向右拖動 → si.nPos > iHorzPos → 差值為負 → dx 為負 → 內容向左移動 → 顯示更右側內容 ✓
差值 = 舊位置 - 新位置,符合「內容移動方向與滾動條移動方向相反」的直覺:滾動條下移 → 內容上移 → 顯示後面的數據。代碼邏輯完全正確。