2010-06-05 84 views
0

現在我有一個水平廣告垂直滾動條的窗口。我使用這些參數來初始化它。WinAPI滾動條幫助

//Set OGL Frame scroll bar 
    SCROLLINFO inf; 
    inf.cbSize = sizeof(SCROLLINFO); 
    inf.fMask = SIF_PAGE | SIF_POS; 
    inf.nPage = 20; 
    inf.nPos = 30; 

它創造了他們在中心,我喜歡它們的大小,但是當我滾動我由50創造chopiness繁殖。我怎麼能添加更多的分辨率,並保持相同的拇指大小。有沒有一種方法可以根據上述參數計算條的大小和位置?

謝謝

+0

不清楚你的意思是通過分辨率或拇指大小。你可以試用ControlSpy來了解更多關於控件的知識:http://msdn.microsoft.com/en-us/library/bb773165(VS.85)。 aspx – Default 2010-06-05 14:14:59

+0

控制間諜做的伎倆謝謝!如果需要,您可以將其作爲答案提交。 – jmasterx 2010-06-05 14:36:51

回答

1

對,這是我的解決方案,即使已經接受了。

每當我遇到與Windows控件有關的問題時,我都會使用Controlspy進行試驗。 Controlspy還列出了可以發送到不同控件的所有不同消息。找到與您正在嘗試執行的操作類似的操作,然後在MSDN上查看特定消息。

+1

感謝:-)我用這個來解決我的問題 – jmasterx 2010-06-07 13:39:18

0

這是我處理滾動事件的舊代碼塊。您可以使用相同的「定製」的方法。

請注意,它可能(可能)不是解決此問題的最佳方法,但仍然是可行的。

case WM_VSCROLL: 
    { 
     TEXTHANDLER * handler = ((TEXTHANDLER *)GetProp(hWnd, "TEXTHANDLER")); 
     BOOL needInvalidation = TRUE; 
     SCROLLINFO si; 

     si.cbSize = sizeof(si); 
     si.fMask = SIF_ALL; 
     GetScrollInfo(hWnd, SB_VERT, &si); 

     switch (LOWORD(wParam)) 
     { 
     case SB_LINEUP: 
     si.nPos -= 1; 
     if (si.nPos < 0) 
     { 
      si.nPos = 0; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_LINEDOWN: 
     si.nPos += 1; 
     if (si.nPos > si.nMax) 
     { 
      si.nPos = si.nMax; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_PAGEUP: 
     si.nPos -= handler->renderer->cyCount; 
     if (si.nPos < 0) 
     { 
      si.nPos = 0; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_PAGEDOWN: 
     si.nPos += handler->renderer->cyCount; 
     if (si.nPos > si.nMax) 
     { 
      si.nPos = si.nMax; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_THUMBTRACK: 
     si.nPos = si.nTrackPos; 
     break; 
     } 

     si.fMask = SIF_POS; 
     SetScrollInfo(hWnd, SB_VERT, &si, TRUE); 

     // Set new text renderer parameters 
     handler->renderer->yPos = si.nPos; 

     if (needInvalidation) InvalidateRect(hWnd, NULL, FALSE); 
     return 0; 
    }