. Home키 처리

키보드의 Home키는 줄의 처음으로 이동하는 기능을 가지고 있다. 그런데 들여쓰기가 된 문서는 줄의 처음으로 가 봐야 공백밖에 없으므로 다시 문자가 있는 곳까지 이동해야 하는 불편함이 있다. 그래서 Home키를 누를 때 아예 줄 처음으로 가지 말고 첫 번째 문자가 있는 곳으로 가는 것이 편리하며 대부분의 편집기들이 이 기능을 지원하고 있다.

Home키의 이런 특성은 프로그래밍 소스를 편집할 때 특히 유용하지만 일반 텍스트는 들여쓰기를 하지 않기 때문에 있으나 마나 별 도움이 안된다. 오히려 이 기능이 부자연스러울 수도 있으므로 설정 옵션으로 만들고 옵션에 따라 캐럿이동 방식을 선택할 수 있도록 해보자. CApiEdit에 다음 변수를 추가한다.

 

class CApiEdit

{

     ....

     BOOL bHomeToFirstChar;

 

이 변수가 TRUE이면 Home키를 누를 때 줄의 처음으로 가지 않고 첫 문자가 있는 위치로 이동한다. 특별한 이유가 없는 한 이 방식대로 이동하는 것이 편리하므로 디폴트는 TRUE로 설정하는 것이 좋다. SetDefaultSetting에서 이 옵션을 TRUE로 초기화한다.

 

void CApiEdit::SetDefaultSetting()

{

     ....

     bHomeToFirstChar=TRUE;

}

 

Home키 입력을 처리하는 코드는 OnKey에 있는데 이 함수에 약간의 코드만 추가하면 된다. 다음과 같이 코드를 작성한다.

 

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

{

    int toff;

 

     switch (vk)

     {

     ....

     case VK_HOME:

          GetRCFromOff(off,r,c);

          OldOff=off;

          if (bControl) {

              off=0;

          } else {

              off=GetOffFromRC(r,0);

           if (bHomeToFirstChar) {

               toff=off;

               while (AeIsWhiteSpace(buf[toff]))

                   toff++;

               if (OldOff!=toff && !AeIsLineEnd(buf[toff])) {

                   off=toff;

               }

           }

          }

          bLineEnd=FALSE;

          if (bShift) {

              ExpandSelection(OldOff,off);

          } else {

              ClearSelection();

          }

          SetCaret();

          return;

 

일단 기존 방식대로 off는 줄의 처음으로 이동시킨다. 그리고 toff에 첫 문자의 위치를 구하는데 off에서 시작해서 첫 번째 공백이 아닌 위치를 찾으면 된다. 그러면 off는 줄 처음을 가리키고 있고 toff는 첫 문자 위치를 가리키고 있을 것이다. 이 두 위치 중 어떤 위치를 취할 것인가만 결정하면 된다.

Home키를 누르기 전의 위치인 OldOff가 첫 문자인 경우만 제외하고 toff를 선택한다. 만약 이미 첫 문자 위치에 와 있는 상태에서 다시 Home키를 눌렀다면 이때는 줄 처음을 찾아간다. 그래서 Home키를 반복적으로 누르면 줄 처음과 첫 문자 사이를 왔다 갔다 할 것이며 사용자는 두 개의 시작위치 중 마음에 드는 위치를 찾을 때까지 Home키를 누르면 된다.