. 이전, 이후 찾기

이전 이후 찾기는 앞에서 이미 한 번 수행했던 검색을 반복하는 명령이다. <F3>, <Shift+F3>  단축키로 쉽게 명령을 내릴 수 있으며 검색 옵션을 다시 설정하지 않아도 되므로 반복적인 검색에 자주 사용된다. 검색에 관련된 모든 코드가 작성되어 있으므로 기능 구현은 아주 쉽다.

 

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

{

     ....

     DWORD tFlag;

          ....

     case IDM_SEARCH_NEXT:

          if (lstrlen(arFind[0].Get(0))) {

              tFlag=FindFlag;

              tFlag &= ~AE_FIND_UP;

              if (pSi->Ae.FindText(-1,arFind[0].Get(0), tFlag) == FALSE) {

                   MessageBox(hWnd,"찾는 문자열이 없습니다.","알림",MB_OK);

              }

          }

          break;

     case IDM_SEARCH_PREV:

          if (lstrlen(arFind[0].Get(0))) {

              tFlag=FindFlag;

              tFlag |= AE_FIND_UP;

              if (pSi->Ae.FindText(-1,arFind[0].Get(0), tFlag) == FALSE) {

                   MessageBox(hWnd,"찾는 문자열이 없습니다.","알림",MB_OK);

              }

          }

          break;

 

이전 검색은 FindText로 검색을 반복하되 검색 옵션에 AE_FIND_UP 플래그를 제거한 후 검색하면 되고 이후 검색은 이 플래그를 강제로 준 후 검색하면 된다. 이 두 명령은 찾을 내용이 히스토리에 기억되어 있을 때만 사용할 수 있다.

 

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

{

     ....

     if (hActive) {

          ....

          if (lstrlen(arFind[0].Get(0)) == 0) {

              EnableMenuItem(hMenu,IDM_SEARCH_NEXT, MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hMenu,IDM_SEARCH_PREV, MF_BYCOMMAND | MF_GRAYED);

          } else {

              EnableMenuItem(hMenu,IDM_SEARCH_NEXT, MF_BYCOMMAND | MF_ENABLED);

              EnableMenuItem(hMenu,IDM_SEARCH_PREV, MF_BYCOMMAND | MF_ENABLED);

          }

     }

}

 

최근에 찾았던 문자열은 검색 히스토리의 제일 위에 있으므로 arFind[0].Get(0) 함수 호출로 구할 수 있으며 이 문자열의 길이가 0보다 크기만 하면 이 두 명령을 사용할 수 있다. 히스토리 정보는 레지스트리에 영구적으로 저장되므로 최초 실행했을 때를 제외하고는 항상 사용할 수 있는 셈이다.