将rect(和point)滚动到视图中

时间:2011-04-27 23:11:42

标签: c++ mfc user-controls

我有逻辑顺序问题。

让我们说我有三点意义。编辑字段的左侧,编辑字段的右侧,编辑字段中的插入符号位置。

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

要显示具有焦点的字段,我通常会尝试按此顺序确保以下内容。 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;
}

1 个答案:

答案 0 :(得分:0)

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

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