我是win32 API的新手。我需要使用滾動條來移動屏幕以查看某些圖形繪圖。假設我的X軸是1500個單位長度(像素?)。我初始化我的滾動條,如下:Win32滾動條:拖動水平滾動條到最右邊位置時,nPos的值不會達到nMaxPos
SCROLLINFO si;
si.cbSize = sizeof (si) ;
si.fMask = SIF_ALL;
si.nMin = 0 ;
si.nMax = 1500 ;
si.nPage = 100 ;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
我也有手柄的情況下爲WM_SIZE和WM_HSCROLL如下:
case WM_SIZE:
SetScrollRange(hwnd, SB_HORZ, 0, 1500, TRUE);
case WM_HSCROLL:
GetScrollInfo (hwnd, SB_HORZ, &si) ;
iPosBeforeScroll = si.nPos ;
iWindowShiftPerScrollClick = 1;
switch (LOWORD (wParam))
{
case SB_LINELEFT: // press left button
si.nPos -= iWindowShiftPerScrollClick ;
xShift = -iWindowShiftPerScrollClick;
break ;
case SB_LINERIGHT: // press right button
si.nPos += iWindowShiftPerScrollClick ;
xShift = iWindowShiftPerScrollClick;
break ;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos ;
xShift = si.nTrackPos - iPosBeforeScroll;
break;
}
si.fMask = SIF_ALL ;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
GetScrollInfo (hwnd, SB_HORZ, &si) ;
ScrollWindow (hwnd, -xShift, 0, NULL, NULL) ;
UpdateWindow(hwnd);
當我運行該程序,我觀察到,當滾動條搬到最右邊的位置,價值si.nPos只能達到。不應該是因爲我已經設置範圍爲?另外,當滾動條位於最右側位置時,我仍然可以按滾動條向右移動按鈕,屏幕移動但滾動條保持在同一位置。我可以按滾動條右鍵直到nPos達到最大值(我的情況是1500)。
我的問題是:
1>什麼是高於正常發生的呢?如果是,當我拖動滾動條到給定範圍的最大限制時,如何計算nPos的值是多少?
2>滾動條中的一個單位移動等同於窗口繪圖中的一個單位移動(像素)嗎?
UPDATE:
只是觀察滾動條可以拖動最多隻有 「nMaxPos - 99」。這部分回答了我的第一個問題。
謝謝。你是對的。我不認爲nPage可能與滾動位置有任何關係。 :) –