2013-11-20 2 views
1

CRichEditCtrl에서 파생 된 CMyRichEditCtrl이 있습니다. SetSel을 호출하면 CRichEditCtrl의 내용이 자동으로 스크롤되어 캐럿이 표시됩니다. 이 동작을 피하고 싶습니다.CRichEditCtrl SetSel에서 자동 스크롤 방지

6.0과 다른 버전 사이에서이 동작이 변경된 것 같습니다.

2,010 비주얼 스튜디오 : 캐럿을 개시 (또는 cpMin nStartChar) 및 최종 (또는 cpMax nEndChar) 지수의 큰 의해 표시된 선택의 끝에 배치된다 http://msdn.microsoft.com/en-us/library/4zek9k1f(v=vs.100).aspx

. 이 함수 은 CRichEditCtrl의 내용을 스크롤하여 캐럿이 표시되도록합니다.

비주얼 스튜디오 6.0 : http://msdn.microsoft.com/en-us/library/aa313352(v=vs.60).aspx

캐럿이 개시의 이상 (cpMin 또는 nStartChar) 및 단부 (cpMax 또는 nEndChar)에 의해 표시되는 선택 항목의 단부에 위치 인덱스 . 이 함수 은 CRichEditCtrl의 내용을으로 스크롤하지 않으므로 캐럿이 표시됩니다.

SetSel을 호출 할 때 컨트롤의 자동 스크롤을 방지하는 방법이 있습니까?

답변

1

이것은 쉬운 방법은 아니지만 드디어 해결 방법을 찾았습니다.

void CMyRichEditCtrl::doStuff() 
{ 
    SetRedraw(FALSE); 

    int nOldFirstVisibleLine = GetFirstVisibleLine(); 

    // Save current selection 
    long lMinSel, lMaxSel; 
    GetSel(lMinSel, lMaxSel); 

    // Do something here 
    doSomething(); 

    // Restore selection 
    SetSel(lMinSel, lMaxSel); 

    // Prevent the auto-scroll of the control when calling SetSel() 
    int nNewFirstVisibleLine = GetFirstVisibleLine(); 

    if(nOldFirstVisibleLine != nNewFirstVisibleLine) 
     LineScroll(nOldFirstVisibleLine - nNewFirstVisibleLine); 

    SetRedraw(TRUE); 

    RedrawWindow(); 
} 
-2

변경

에 RedrawWindow (0,0, RDW_NOERASE);

더 좋습니다.

+1

OP의 질문에 답을 얻지 못하기 때문에 새로운 대답이 아닌 @MasterMind의 previos 응답에 주석으로 추가해야합니다. –

+0

@ user3073563 : RedrawWindow()를 RedrawWindow (0,0, RDW_NOERASE)로 바꿀 때 RichEditCtrl이 문자를 더 이상 표시하지 않고 이상하게 작동합니다. 더 나은 결과가 나오기 전에 시도해 보셨습니까? – MasterMind