2010-06-05 55 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; 
    }