. 자동개행 상태 변경

nWrap 변수는 프로그램 전반에 걸쳐 영향을 미치며 이 값을 바꾸면 정렬 상태가 완전히 달라질 것이다. 그런데 이 상태는 변수에 의해 기억되므로 실행중에 값을 바꿀 수는 없고 OnCreate에서 nWrap의 초기값을 바꾼 후 컴파일을 다시 해야만 정렬 상태를 바꿀 수 있다. 정렬 상태를 실행중에도 바꿀 수 있도록 함수를 추가해보자.

 

void SetWrap(int aWrap)

{

     nWrap=aWrap;

     InvalidateRect(hWndMain,NULL,TRUE);

     SetCaret();

}

 

이 함수는 인수로 전달된 aWrap nWrap에 대입하여 정렬방식을 변경한다. 그리고 정렬 상태가 변경됨으로써 해야 할 추가 조치를 취하는데 현 단계에서는 화면을 다시 그리고 캐럿을 옮기는 정도의 일만 하면 된다. 그러나 앞으로 기능이 점점 늘어나면 여기서 해야 할 일들도 같이 늘어나게 될 것이다.

이 함수는 사용자가 직접 호출하는 것이 아니며 ApiEdit가 컨트롤이 될 때 컨트롤을 사용하는 호스트 프로그램이 사용한다. 그래서 ApiEdit가 이 함수를 호출하는 유저 인터페이스를 제공해야 할 필요는 없다. 하지만 당장 테스트는 해야 하므로 다음과 같이 임시 코드를 추가 하도록 하자.

 

void OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     int r,c;

 

     if (fDown==FALSE)

          return;

 

     switch (vk)

     {

    case VK_F9:

        nWrap++;

        if(nWrap==4)

            nWrap=0;

        SetWrap(nWrap);

        return;

     ....

 

당장 사용하지 않는 F9키를 nWrap 변수 토글을 위해 사용하였다. 이런 임시 코드를 당장 쓰지 않는 키에 할당해서 테스트하면 학습에 꽤 도움이 될 것이다. 이제 실행중에 F9키를 눌러서 자동개행 상태를 바꿀 수 있다. 이 코드는 당분간 테스트를 위해 필요하므로 삭제하지 말고 유지하도록 하자.

 

자동 정렬 기능을 구현했고 관련된 함수들을 수정했는데 큰 기능이 들어갔음에도 불구하고 많은 부분이 수정되지 않았다. 커서이동키 조작이나 SetCaret 함수, GetXYFromOff 함수들도 다 수정되어야 할 것 같지만 그럴 필요는 없다. 왜냐하면 이 함수들이 호출하는 GetLine 함수와 GetRCFromOff 함수가 수정되었기 때문에 이 함수들도 모두 같이 영향을 받기 때문이다.