. 검색 관련 옵션

여기서 말하는 검색 관련 옵션은 대소문자 구분, 검색 방향 등의 검색시 적용되는 옵션이 아니다. 검색 방식을 지정하는 옵션(FindFlag)들은 찾기/바꾸기 대화상자에서 직접 변경하고 조정할 수 있지만 여기서 말하는 검색 관련 옵션들은 찾기 대화상자가 열리기 전에 적용되어야 하는 것들이다. 찾기 대화상자 초기화와 관련된 옵션이기 때문에 찾기 대화상자에서는 이 옵션을 조정할 수 없으며 기본 설정 대화상자에서 이 옵션들을 조정해야 한다. SOption 구조체에 두 개의 검색 관련 옵션 변수가 포함되어 있다.

 

struct SOption

{

     ....

     BOOL bInitFind;

     BOOL bInitNextFind;

 

void SOption::Init()

{

     bInitFind=TRUE;

     bInitNextFind=FALSE;

 

이 두 옵션은 약간 설명이 필요하다. bInitFind는 찾기 대화상자의 찾을 내용 콤보박스를 현재 캐럿 위치의 단어 또는 선택영역으로 초기화할 것인가를 지정한다. 이 값이 TRUE이면 찾기 대화상자가 열릴 때 캐럿 위치의 단어를 미리 선택하며 FALSE이면 항상 마지막 검색한 단어(arFind[0].Get(0))를 대상으로 한다. 찾을 대상이 캐럿 위치에 있을 확률이 높기 때문에 이 옵션의 디폴트값은 TRUE로 초기화하였다.

bInitNextFind는 다음 찾기, 이전 찾기 대상을 동일한 방식으로 초기화할 것인가를 지정한다. 이렇게 되면 다음 찾기(<F3>)는 사실상 다음 단어 찾기(<Ctrl+F3>)와 기능이 같아진다. 단어 위에서 또는 검색할 대상을 선택해놓고 바로 <F3>을 누르면 다음 위치를 찾아 주므로 편리하다. 이 옵션이 선택되어 있더라도 검색 후 다음 찾기에 별 문제는 없다. 왜냐하면 검색결과가 이미 선택되어 있는 상태에서 이 명령을 사용하는 경우가 많기 때문이다. 하지만 검색 후 이동하다가 다음 검색 위치로 가고자 할 때는 이런 동작이 불편할 수도 있기 때문에 디폴트값은 FALSE이다.

두 옵션의 적용은 아주 간단하다. bInitFind는 대화상자가 열릴 때 활성창의 현재 단어를 가져와 콤보박스에 대입하기만 하면 된다.

 

BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

    HWND hActive;

    SInfo *pSi;

    int s,e;

     ....

     switch(iMessage)

     {

     case WM_INITDIALOG:

          ....

          RefillHistory(GetDlgItem(hDlg,IDC_FIND_WHAT),arFind[0]);

        if (Option.bInitFind) {

           hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

           pSi=(SInfo *)GetWindowLong(hActive,0);

           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) {

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

               SetDlgItemText(hDlg,IDC_FIND_WHAT,szTemp);

           }

        }

          RefillHistory(GetDlgItem(hDlg,IDC_FIND_TO),arFind[1]);

          SendMessage(GetDlgItem(hDlg,IDC_FIND_WHAT), CB_LIMITTEXT, (WPARAM)255, 0);

          SendMessage(GetDlgItem(hDlg,IDC_FIND_TO), CB_LIMITTEXT, (WPARAM)255, 0);

          SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_FIND_WHAT,CBN_EDITCHANGE),0);

          return TRUE;

          ....

 

RefillHistory 함수에 의해 찾을 내용 콤보박스에 arFind[0] 히스토리 목록이 대입되는데 이 목록의 첫 번째 항목을 무시하고 활성창의 선택된 단어, 또는 현재 단어를 가져오는 것이다. bInitNextFind는 더 간단하다. F3=Ctrl+F3, Shift+F3=Ctrl+Shift+F3과 같아지므로 메시지만 바꿔서 보내주면 된다.

 

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

{

     ....

     case IDM_SEARCH_NEXT:

        if (Option.bInitNextFind) {

           SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_SEARCH_WORD,0),0);

          } else 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 (Option.bInitNextFind) {

           SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_SEARCH_WORDUP,0),0);

          } else 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;

 

설정 대화상자에는 이미 이 옵션을 조정할 수 있도록 프로그래밍되어 있으며 이 옵션이 바뀐다고 해서 즉시 어떤 조치를 할 필요는 없으므로 ApplyNow에서는 아무 것도 할 필요가 없다.