. 편집 파일의 순서

당근은 시작할 때의 옵션(StartAction) 편집하던 모든 문서 열기라는 값을 가지고 있다. 이 옵션을 구현하기 위해 OnDestroy에서 편집하던 파일의 목록을 레지스트리에 저장하고 OnTimer에서 이 파일들을 다시 읽어오는 코드가 작성되어 있는데 OnDestroy 함수에 작성된 목록 저장 코드를 보도록 하자.

 

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

{

     ....

     nEditing=0;

     hChild=GetWindow(g_hMDIClient,GW_CHILD);

     while (hChild) {

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

          if (strncmp(pSi->NowFile,"이름없음",8)!=0) {

              wsprintf(szKey,"%d",++nEditing);

              SHRegWriteString(SHCU,KEY"Editing",szKey,pSi->NowFile);

          }

          hChild=GetWindow(hChild,GW_HWNDNEXT);

     }

     SHRegWriteInt(SHCU,KEY"Editing","Num",nEditing);

 

이 코드는 첫 번째 차일드부터 모든 차일드를 순회하면서 편집중인 파일의 완전 경로를 레지스트리에 저장하는데 정보를 저장한다는 측면으로만 보면 아무런 문제가 없다. 하지만 GetWindow 함수가 구하는 차일드의 순서는 포커스 순서대로이기 때문에 문서의 저장 순서가 일정하지 않다는 점이 문제다. 1,2,3,4,5 파일을 편집하고 있었다면 다음 번 당근을 실행했을 때도 이 순서대로 열리면 좋은데 2,4,5,3,1과 같이 순서가 엉망으로 열려 버린다.

OnDestory가 문서를 저장하는 순서는 어떤 문서를 최근에 편집했는가를 기준으로 하지만 사용자는 이 순서보다는 자신이 문서를 열었던 순서를 더 중요시한다. 파일을 열었던 순서는 파일탭의 탭 순서와 일치하므로 이 순서대로 파일 목록을 저장하면 사용자가 원하는 순서대로 목록을 저장할 수 있다. OnDestroy의 목록 저장 코드를 다음과 같이 수정한다.

 

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

{

    HWND hActive;

     TCHAR szKey[16];

     int nEditing;

     SInfo *pSi;

     BOOL bMax;

     int i,j;

    int count;

    TCITEM tie;

 

     Option.Save(KEY);

    

     nEditing=0;

    count=TabCtrl_GetItemCount(hFileTab);

    for (i=0;i<count;i++) {

        tie.mask=TCIF_PARAM;

        TabCtrl_GetItem(hFileTab,i,&tie);

        if (strncmp((TCHAR *)tie.lParam,"이름없음",8)!=0) {

           wsprintf(szKey,"%d",++nEditing);

           SHRegWriteString(SHCU,KEY"Editing",szKey,(TCHAR *)tie.lParam);

        }

    }

     SHRegWriteInt(SHCU,KEY"Editing","Num",nEditing);

     ....

 

탭 컨트롤에 등록된 파일 순서대로 목록을 저장하였다. 이렇게 목록 저장 방법을 바꾸면 사용자들이 열었던 순서 그대로 레지스트리에 저장되며 다음 번 실행시에 이 순서대로 파일이 읽혀질 것이다. 당근을 종료했다가 다시 실행해도 파일탭에 등록되는 순서가 그대로 유지된다.