. 파일탭

파일탭은 열린 파일의 목록을 보여주고 탭을 누르면 해당 파일로 포커스를 옮겨주는 장치이다. 비주얼 C++ 7.0버전부터 파일탭을 지원하고 있는데 탭을 눌러 편집하고자 하는 파일을 직접 선택할 수 있다는 점에서 아주 편리하다. 파일탭이 없다면 <Ctrl+Tab>으로 원하는 파일이 나올 때까지 차일드를 스위칭해 봐야 하는데 열린 파일이 많으면 아주 불편하다.

당근의 파일탭 윈도우는 비록 껍데기지만 앞에서 미리 만들어 두었는데 이제 제대로 만들어보자. 나 파일탭 이라고 출력하던 썰렁한 윈도우 프로시저를 다음과 같이 다시 작성한다.

 

LRESULT CALLBACK DGTabProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     HDC hdc;

     PAINTSTRUCT ps;

     HPEN hPen,OldPen;

     RECT crt;

 

     switch(iMessage) {

     case WM_CREATE:

          hFileTab=CreateWindow(WC_TABCONTROL,"",WS_CHILD | WS_VISIBLE

              |WS_CLIPSIBLINGS | TCS_FOCUSNEVER,

              0,0,0,0,hWnd,NULL,g_hInst,NULL);

          SendMessage(hFileTab,WM_SETFONT,(WPARAM)hGul9,(LPARAM)FALSE);

          hTabImg=ImageList_LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_TABS),

              12, 1, RGB(255,255,255));

          TabCtrl_SetImageList(hFileTab,hTabImg);

          return 0;

     case WM_SIZE:

          MoveWindow(hFileTab,0,2,LOWORD(lParam),HIWORD(lParam)-2,TRUE);

          return 0;

     case WM_PAINT:

          hdc=BeginPaint(hWnd, &ps);

          GetClientRect(hWnd,&crt);

          hPen=CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DSHADOW));

          OldPen=(HPEN)SelectObject(hdc,hPen);

          MoveToEx(hdc,0,0,NULL);

          LineTo(hdc,crt.right,0);

          DeleteObject(SelectObject(hdc,OldPen));

          hPen=CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DHILIGHT));

          SelectObject(hdc,hPen);

          MoveToEx(hdc,0,1,NULL);

          LineTo(hdc,crt.right,1);

          DeleteObject(SelectObject(hdc,OldPen));

          EndPaint(hWnd, &ps);

          return 0;

     case WM_DESTROY:

          ImageList_Destroy(hTabImg);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

파일탭 표현을 위해 Win32 탭 컨트롤을 생성했으며 TCS_FOCUSNEVER 스타일을 주어 포커스를 받지 못하도록 하였다. 그래서 당근의 파일탭은 키보드로는 조작할 수 없으며 마우스로만 조작할 수 있다. 각 탭에는 편집중인 파일의 이름과 파일의 변경 여부를 알려주는 이미지를 표시하는데 리소스에는 다음 두 개의 이미지가 작성되어 있다. 파란색 박스는 이 파일이 아직 편집되지 않았다는 뜻이며 빨간색 박스는 파일이 편집되었다는 뜻이다.

다른 컨트롤들과 마찬가지로 탭 컨트롤의 폰트도 굴림 9포인트로 변경하였다. 탭 컨트롤이 워낙 작기 때문에 폰트도 가급적이면 작게 만들어야 보기에 좋고 파일명이 길어져도 탭이 지나치게 커지는 것을 방지할 수 있다. WM_PAINT에서는 탭 컨트롤 위에 2픽셀의 입체적인 수평선을 직접 그리는데 이 수평선은 탭 컨트롤과 툴바의 경계를 명확하게 구분하는 역할을 한다. 왼쪽 그림은 툴바와 탭 컨트롤 사이에 수평선을 그은 것이고 오른쪽 그림은 구분없이 두 컨트롤이 인접해 있는 모양인데 구분선이 없으면 상당히 어색해보인다.

 

탭 컨트롤을 당근의 차일드로 바로 생성하지 않고 탭 프레임을 만든 후 그 차일드로 생성한 이유가 바로 이 수평선을 긋기 위해서이다. 탭 컨트롤에 위쪽 경계선을 긋는 스타일이 있거나 툴바에 아래쪽 경계선을 긋는 스타일이 있다면 이렇게 할 필요가 없겠지만 그런 스타일이 없어서 탭 프레임 윈도우를 만들고 직접 선을 긋도록 했다. 리바(Rebar) 컨트롤을 먼저 만들고 이 안에 툴바를 배치했다면 자연스럽게 경계선이 생기지만 리바는 너무 복잡하다.

WM_SIZE에서 위쪽의 수평선 2픽셀을 제외한 나머지 작업영역 전체에 탭 컨트롤을 가득 채웠다. 탭 프레임의 작업영역 대부분을 탭 컨트롤이 차지하고 있으므로 탭 컨트롤이 곧 파일탭이라고 생각하면 된다.