2011-04-27 74 views
0

我有一個邏輯順序問題。滾動rect(和點)到視圖

可以說我有三點意義。編輯欄左側,編輯欄右側,光標在編輯欄中的位置。

我想顯示具有焦點的控件,並顯示它是插入符號。

要顯示有焦點的字段,我通常會按照此順序嘗試確保以下內容。 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

嗯..你可以顯示一些問題行爲的截圖,並注意哪裏有問題? – 2011-04-27 23:46:08

+0

我想通了。我需要選擇是否要關注光標。移到字段左側總是會滾動到插入符號的右側。但是如果我知道我要滾動到插入符,我只是不滾動到該字段的左側。 – 2011-05-13 15:18:39

回答

0

這裏的解決方案。如果需要將插入符號滾動到視圖中,請勿將字段的矩形滾動到視圖中。要決定,請檢查該字段是否大於可滾動區域。

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