我有逻辑顺序问题。
让我们说我有三点意义。编辑字段的左侧,编辑字段的右侧,编辑字段中的插入符号位置。
我想显示具有焦点的控件,并显示它的插入符号。
要显示具有焦点的字段,我通常会尝试按此顺序确保以下内容。 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;
}
答案 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);
}
}