У меня проблема с логическим порядком.
Допустим, у меня есть три важных момента. Левая сторона поля редактирования, правая сторона поля редактирования, позиция каретки в поле редактирования.
Я хочу показать элемент управления с фокусом и показать его каретку.
Чтобы показать поле с фокусом, я обычно стараюсь обеспечить следующее в этом порядке.
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;
}