2014-04-16 37 views
0

我是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」。這部分回答了我的第一個問題。

回答

2

問題1: 這在SetScrollInfo完全記載:

這裏的相關因素是頁面大小。

從文檔:

和SetScrollInfo功能執行範圍上檢查由SCROLLINFO結構的n頁面和非營利組織成員所指定的值 。 nPage成員必須指定一個從0到nMax - nMin +1的值。 nPos成員必須指定nMin和nMax之間的值 - max(nPage- 1,0)。如果任一值超出其範圍,則該函數將其設置爲僅在該範圍內的 值。

對於問題2: 這取決於你在做什麼。實際上沒有:1.滾動條中的刻度可以是滾動條中的1行(列表框,樹形控件等)。或者如果使用GDI映射模式,則爲1個邏輯點。 滾動條做你想做的。只要滾動條沒有綁定到現有控件(ListCtrl,TreeCtrl,Edit Ctrl)

+0

謝謝。你是對的。我不認爲nPage可能與滾動位置有任何關係。 :) –