полоса прокрутки c ++ к окну - PullRequest
1 голос
/ 20 мая 2010

эй, вот я создаю окно: _hWnd = CreateWindowEx ( WS_EX_CLIENTEDGE, // dwExStyle (LPCWSTR) _wndClass, // lpClassName L "", // lpWindowName WS_CHILD | WS_HSCROLL | WS_VSCROLL, // dwStyle CW_USEDEFAULT, // X CW_USEDEFAULT, // Y 200, // nWidth 150, // nHeight hWndParent, // hWndParent NULL, // hMenu hInstance, // hInstance NULL // lpParam );

Я добавил полосы прокрутки (WS_HSCROLL | WS_VSCROLL), но как я могу ими управлять?

1 Ответ

1 голос
/ 20 мая 2010

Я думаю, вы должны обратиться к MSDN за дополнительной информацией, но вот небольшая часть кода, который я написал однажды (просто для вас, чтобы начать с чего-то).

Обычно идея заключается в обработке определенных сообщений в вашей подпрограмме WindowProcedure (WM_HSCROLL, WM_VSCROLL). Самый простой способ оценить новую позицию скроллера (я имею в виду способ WinAPI) - это использовать конкретную структуру SCROLLINFO. В следующем фрагменте кода используется SCROLLINFO si.

  case WM_HSCROLL:
    {
      TEXTHANDLER * handler = ((TEXTHANDLER *)GetProp(hWnd, "TEXTHANDLER"));

      // If user is trying to scroll outside
      // of scroll range, we don't have to
      // invalidate window
      BOOL needInvalidation = TRUE;

      if (handler->renderer->wordWrap)
      {
        return 0;
      }

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

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

      case SB_LINERIGHT: 
        si.nPos += 1;
        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_HORZ, &si, TRUE);

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

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

  case WM_VSCROLL:
    {
      TEXTHANDLER * handler = ((TEXTHANDLER *)GetProp(hWnd, "TEXTHANDLER"));

      BOOL needInvalidation = TRUE;

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