. 마지막 편집 위치로 가기

이 기능은 제목 그대로 스크롤이나 캐럿이동 후에 마지막 편집하던 위치로 돌아가는 기능이다. 편집중에 다른 곳을 잠시 확인해 볼 일이 있으면 마음대로 돌아 다니다가 이 명령으로 신속하게 돌아올 수 있어 꽤 실용적이다. 마지막 편집하던 위치를 저장할 변수와 이 위치로 이동할 함수를 선언한다.

 

 

class CApiEdit

{

private:

     ....

     int LastEditOff;

 

public:

     void GotoLastEditOff();

};

 

마지막 편집 위치 LastEditOff InitDoc, SetText에서 0으로 초기화된다.

 

void CApiEdit::SetText(TCHAR *TextBuf)

{

     InitDoc();

     Insert(0,TextBuf,FALSE);

    LastEditOff=0;

}

 

void CApiEdit::InitDoc()

{

     ....

     off=0;

    LastEditOff=0;

 

SetText에서 InitDoc을 호출하므로 InitDoc에서만 초기화하면 될 것 같지만 Insert 함수에서 이 값을 다시 바꾸기 때문에 SetText에도 초기화 코드가 있어야 한다. LastEditOff는 문서가 편집될 때마다 현재 오프셋으로 갱신되는데 두 군데가 있다. 여기까지 실습을 해 왔다면 이제 이 코드가 어디에 삽입되어야 하는지는 말 안해도 뻔하게 알 수 있을 것이다.

 

void CApiEdit::Insert(int nPos, TCHAR *str, BOOL bRec/*=TRUE*/)

{

     ....

     UpdateLineInfo(nPos,lstrlen(str));

     UpdateScrollInfo();

     SetModified(TRUE);

    LastEditOff=nPos+len;

     ....

 

void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)

{

     ....

     UpdateLineInfo(nPos,-nCount);

     UpdateScrollInfo();

     SetModified(TRUE);

     doclen-=nCount;

    LastEditOff=nPos;

}

 

그렇다. 맨날 집적대는 바로 저 두 곳이다. 문자열이 삽입, 삭제될 때마다 문서가 편집되므로 이 때의 오프셋을 LastEditOff에 저장해놓으면 된다. 이 위치로 이동하는 함수는 다음과 같다.

 

void CApiEdit::GotoLastEditOff()

{

     ClearSelection();

     off=LastEditOff;

     SetCaret();

}

 

캐럿이 이동되므로 선택영역이 있으면 먼저 해제해야 한다. 전역변수 off만 바꾸고 SetCaret만 호출하면 캐럿이 있는 위치로 즉시 이동한다. 호스트에서 이 명령이 선택되면 GotoLastEditOff만 호출하면 된다.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_SEARCH_LASTEDIT:

          pSi->Ae.GotoLastEditOff();

          break;

 

이 명령에는 <Ctrl+Q> 액셀러레이터가 할당되어 있으므로 편집중에 문서의 다른 부분을 보다가 <Ctrl+Q>만 누르면 즉시 마지막 편집하던 위치로 이동한다. 난이도에 비해 굉장히 실용성이 있는 것 같고 개인적으로도 무척 마음에 드는 기능이다. 그래서 단축키도 왼손으로 쉽게 누를 수 있는 <Ctrl+Q>를 할당하는 것으로 애정 표현을 했다.