прокрутка прямоугольника (и точки) в поле зрения - PullRequest
0 голосов
/ 28 апреля 2011

У меня проблема с логическим порядком.

Допустим, у меня есть три важных момента. Левая сторона поля редактирования, правая сторона поля редактирования, позиция каретки в поле редактирования.

Я хочу показать элемент управления с фокусом и показать его каретку.

Чтобы показать поле с фокусом, я обычно стараюсь обеспечить следующее в этом порядке. 1. Убедитесь, что правая сторона видна. 2. Убедитесь, что левая сторона видна. 3. Убедитесь, что каретка (плюс символ максимальной ширины) видна.

Проблема в том, что поле слишком велико для родителя. Элемент управления всегда будет пытаться показать вправо, затем влево, затем каретку. Если каретка близка к концу (и текущая прокрутка обеспечивает видимость правой стороны), и пользователь печатает, родитель прокручивает сразу после каретки, даже если она уже видна. Это фактически прокручивает родителя влево, если каретка <правая сторона. Я не хочу этого делать. </p>

Псевдокод:

if (cFocusRect.right > cClientRect.right) 
{ 
   cFinalPoint.x += cClientRect.right - cFocusRect.right;
   cFocusRect.OffsetRect(cClientRect.right - cFocusRect.right, 0);
   fBoundRight = TRUE;
}
if (cFocusRect.left < 0)
{
   cFinalPoint.x -= cFocusRect.left;
   cFocusRect.OffsetRect(cFocusRect.left, 0);
}

nCaretRight = min(cFocusRect.right, pChild->GetCaretPos().x + nMaxCharWidth);

if (nCaretRight > cClientRect.right)
{
   cFinalPoint.x += cClientRect.right - nCaretRight;
   cFocusRect.OffsetRect(cClientRect.right - nCaretRight, 0);
   fBoundRight = TRUE;
}

1 Ответ

0 голосов
/ 13 мая 2011

Вот решение. Не прокручивайте прямоугольник поля в поле зрения, если вам нужно прокрутить каретку в поле зрения. Чтобы решить, проверьте, больше ли поле, чем область прокрутки.

if (cFocusRect.Width() < cClientRect.Width())
{
    if (cFocusRect.right > cClientRect.right)
    {
        cFinalPoint.x += cClientRect.right - cFocusRect.right;
        cFocusRect.OffsetRect(cClientRect.right - cFocusRect.right, 0);
        cCaretPoint.Offset(cClientRect.right - cFocusRect.right, 0);
        fBoundRight = TRUE;
    }
    if (cFocusRect.left < 0)
    {
        cFinalPoint.x -= cFocusRect.left;
        cFocusRect.OffsetRect(cFocusRect.left, 0);
        cCaretPoint.Offset(cFocusRect.left, 0);
    }
}
else
{
    nCaretRight = min(cFocusRect.right, cCaretPoint.x + (cFocusRect.Height() * 3));

    if (nCaretRight > cClientRect.right)
    {
        cFinalPoint.x += cClientRect.right - nCaretRight;
        cFocusRect.OffsetRect(cClientRect.right - nCaretRight, 0);
        cCaretPoint.Offset(cClientRect.right - nCaretRight, 0);
        fBoundRight = TRUE;
    }

    nCaretLeft = max(cFocusRect.left, cCaretPoint.x);

    if (nCaretLeft < 0)
    {
        cFinalPoint.x -= nCaretLeft;
        cFocusRect.OffsetRect(cClientRect.left - nCaretLeft, 0);
        cCaretPoint.Offset(cClientRect.left - nCaretLeft, 0);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...