Помогите с полосами прокрутки WinAPI - PullRequest
0 голосов
/ 05 июня 2010

Прямо сейчас у меня есть окно с горизонтальными полосами прокрутки объявлений. Я использую эти параметры для его инициализации.

//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 ]

1 голос
/ 07 июня 2010

Да, вот мое решение, хотя одно уже принято.

Каждый раз, когда у меня возникают проблемы с элементами управления Windows, я использую Controlspy , чтобы поэкспериментировать с ними. Controlspy также перечисляет все различные сообщения, которые могут быть отправлены на различные элементы управления. Найдите тот, который похож на то, что вы пытаетесь сделать, и проверьте это конкретное сообщение в MSDN.

0 голосов
/ 05 июня 2010

Вот мой старый кусок кода, который обрабатывает события прокрутки. Вы можете использовать тот же «настроенный» подход.

Обратите внимание, что это (возможно) не лучший способ решения этой проблемы, но все же рабочий.

  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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...