. 현재 단어 찾기

현재 단어 찾기 기능은 캐럿이 있는 위치의 단어를 검색 대상으로 한다. 어떤 단어의 다음 위치를 찾고자 할 때 검색 문자열을 입력하지 않고 <Ctrl+F3> 단축키로 빠르게 검색할 수 있다. 이 기능을 구현 하려면 현재 위치와 특정 범위의 문자열을 조사할 수 있는 기능이 필요하므로 ApiEdit에 이 함수를 추가하도록 하자.

 

     int GetOffset() { return off; }

     void GetText(TCHAR *TextBuf, int BufSize, int s=-1, int e=-1);

 

GetOffset 함수는 현재 편집하고 있는 오프셋을 조사하는데 off 멤버만 리턴하면 된다. GetText 함수는 지정한 부분의 텍스트만 가져올 수 있도록 기능이 확장되었다. 파일 입출력함수들이 이미 GetText 함수를 사용하고 있으므로 원형의 변화가 없도록 디폴트 인수를 추가하고 다음과 같이 수정하였다.

 

void CApiEdit::GetText(TCHAR *TextBuf, int BufSize , int s/*=-1*/, int e/*=-1*/)

{

     if (s==-1) {

          lstrcpyn(TextBuf,buf,BufSize);

     } else {

          lstrcpyn(TextBuf,buf+s,min(BufSize,e-s+1));

     }

}

 

s e가 디폴트값인 -1이면 전체 텍스트를 구하고 범위를 주면 이 범위의 텍스트만 조사하도록 하였다. 이 두 함수를 사용하여 단어 찾기 기능을 구현해보자.

 

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

{

     int s,e;

     TCHAR szTemp[256];

     ....

     case IDM_SEARCH_WORD:

     case IDM_SEARCH_WORDUP:

          int nStart;

          pSi->Ae.GetSelect(s,e);

          if (s==e) {

              pSi->Ae.GetNowWord(pSi->Ae.GetOffset(),s,e);

          }

          if (abs(s-e) > 255 || abs(s-e) <= 0) {

              break;

          }

          pSi->Ae.GetText(szTemp,256,s,e);

          arFind[0].Add(szTemp);

 

          tFlag=FindFlag;

          tFlag &= ~AE_FIND_WHOLEWORD;

          tFlag |= AE_FIND_WRAP;

          if (LOWORD(wParam) == IDM_SEARCH_WORD) {

              tFlag &= ~AE_FIND_UP;

              nStart=max(s,e);

          } else {

              tFlag |= AE_FIND_UP;

              nStart=min(s,e);

          }

          pSi->Ae.FindText(nStart,arFind[0].Get(0),tFlag);

          break;

 

선택영역이 있으면 선택 문자열을 검색하고 그렇지 않으면 캐럿이 있는 위치의 단어를 검색한다. 이 기능은 상세한 옵션 조정없이 비슷한 단어를 최대한 빨리 찾아주는데 목적이 있으므로 단어 단위로 옵션은 끄고 되돌리기 옵션은 켠 상태에서 수행하는 것이 좋다. 대소문자 구분 옵션은 검색 대화상자에서 선택한 옵션을 그대로 사용한다.