将矩形(和点)滚动到视图中

scrolling rect (and point) into view

本文关键字:滚动 视图 和点      更新时间:2023-10-16

我有一个逻辑顺序问题。

假设我有三个重要点。编辑栏左侧,编辑栏右侧,插入符号在编辑栏中的位置

我想显示有焦点的控件,并显示它的插入符号

为了显示有焦点的字段,我通常按照这个顺序尝试确保以下内容。1. 确保右侧可见。2. 确保左侧可见。3.确保插入符号(加上最大宽度字符)可见。

问题是如果字段对父字段太宽。该控件将始终尝试显示右,然后是左,然后是插入。如果插入符号接近结尾(当前滚动确保右侧可见),并且用户键入类型,则父级将滚动到插入符号之后,即使它已经可见。如果插入符号<的右边。我不想那样做。>

伪代码:

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;
}

解决方案如下:如果需要将插入符号滚动到视图中,则不要将字段的矩形滚动到视图中。要确定,请检查该字段是否大于可滚动区域。

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);
    }
}