帮助WinAPI滚动条

时间:2010-06-05 13:46:10

标签: c++ c 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会产生晃动。如何为条形图添加更多分辨率并保持相同的拇指大小。有没有办法根据上述参数计算条形的大小和位置?

由于

2 个答案:

答案 0 :(得分:1)

是的,这是我的解决方案,即使已经接受了。

每次我遇到Windows控件问题时,我都会使用Controlspy来试验它们。 Controlspy还列出了可以发送到不同控件的所有不同消息。找到一个与您尝试的相似的内容,并在MSDN上检查该特定消息。

答案 1 :(得分: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;
    }