. 탭 관리 함수

탭 프레임을 만들고 그 차일드로 탭 컨트롤을 만들어 두었으므로 파일이 열릴 때마다 탭을 추가하여 열린 파일명을 보여주면 된다. 다음 네 함수는 탭 컨트롤을 관리하는 함수이며 탭을 추가, 삭제, 변경, 검색한다. 탭 컨트롤을 프로그래밍하는 방법은 리스트 뷰나 트리 뷰 컨트롤과 거의 동일하다.

 

void AddFileTab(TCHAR *Path)

{

     TCITEM tie;

     int count;

     TCHAR Ext[_MAX_EXT];

     TCHAR Name[MAX_PATH];

     TCHAR *Param;

 

     Param=(TCHAR *)malloc(MAX_PATH);

     lstrcpy(Param,Path);

     _splitpath(Path,NULL,NULL,Name,Ext);

     lstrcat(Name,Ext);

     count=TabCtrl_GetItemCount(hFileTab);

     tie.mask=TCIF_TEXT | TCIF_PARAM | TCIF_IMAGE;

     tie.pszText=Name;

     tie.lParam=(LPARAM)Param;

     tie.iImage=0;

     TabCtrl_InsertItem(hFileTab,count,&tie);

     TabCtrl_SetCurSel(hFileTab,count);

     if (count==0) {

          InvalidateRect(hFileTab,NULL,TRUE);

     }

}

 

int FindFileTab(TCHAR *Path)

{

     int idx;

     int count;

     TCITEM tie;

 

     count=TabCtrl_GetItemCount(hFileTab);

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

          tie.mask=TCIF_PARAM;

          TabCtrl_GetItem(hFileTab,idx,&tie);

          if (lstrcmpi(Path,(TCHAR *)tie.lParam)==0) {

              return idx;

          }

     }

     return -1;

}

 

void DeleteFileTab(TCHAR *Path)

{

     int idx;

     TCITEM tie;

 

     idx=FindFileTab(Path);

     tie.mask=TCIF_PARAM;

     TabCtrl_GetItem(hFileTab,idx,&tie);

     free((LPVOID)tie.lParam);

     TabCtrl_DeleteItem(hFileTab,idx);

}

 

void ChangeFileTab(int idx, TCHAR *Path)

{

     TCITEM tie;

     TCHAR Ext[_MAX_EXT];

     TCHAR Name[MAX_PATH];

     TCHAR *Param;

 

     tie.mask=TCIF_PARAM;

     TabCtrl_GetItem(hFileTab,idx,&tie);

     Param=(TCHAR *)tie.lParam;

     lstrcpy(Param,Path);

 

     _splitpath(Path,NULL,NULL,Name,Ext);

     lstrcat(Name,Ext);

     tie.mask=TCIF_TEXT | TCIF_IMAGE;

     tie.pszText=Name;

     tie.iImage=0;

     TabCtrl_SetItem(hFileTab,idx,&tie);

}

 

AddFileTab 함수는 인수로 전달된 Path 파일을 탭에 추가한다. 탭의 공간이 넓지 않기 때문에 완전 경로를 다 표시할 수 없으며 파일 이름만 추출하여 짧게 표시한다. 예를 들어 C:\data\file.txt 파일을 열었다면 드라이브명과 폴더 경로는 빼고 file.txt만 탭에 표시한다. 하지만 사용자가 탭을 선택했을 때 이 파일을 다시 찾아가기 위해서는 완전 경로를 어딘가에 저장해두어야 한다. 다른 경로의 같은 이름을 가지는 두 파일을 동시에 편집할 수도 있기 때문에 탭에 표시된 파일명만으로는 어떤 파일을 편집하고 있는지 정확하게 구분할 수 없다.

그래서 완전 경로 저장을 위한 메모리를 할당하고 사용자정의 데이터(lParam)에 그 포인터를 저장해두었다. 사용자가 탭을 선택하면 탭의 lParam에 저장된 완전 경로를 읽어 이 파일을 활성화시키면 된다. lParam에 할당된 메모리는 탭이 삭제될 때인 DeleteFileTab에서 해제된다.

FindFileTab 함수는 인수로 전달된 Path 파일을 표시하고 있는 파일탭을 찾아 주는데 모든 탭의 사용자정의 데이터와 Path를 비교해보고 일치되는 탭의 인덱스를 찾아준다. 만약 Path 파일을 편집하고 있는 탭이 없으면 -1을 리턴한다. DeleteFileTab은 탭을 삭제하며 ChangeFileTab은 탭의 텍스트와 사용자정의 데이터를 교체한다.