. 툴바의 생성

툴바는 CreateToolBar 함수가 생성하는데 이 함수를 분석해보자. 툴바 컨트롤도 윈도우이므로 CreateWindow 함수로 생성할 수 있으며 좀 더 전문적인 CreateToolbarEx 함수를 사용할 수도 있다. 툴바의 스타일이나 관련 구조체에 대한 내용은 CD-ROM Doc 디렉토리에 있는 문서를 참조하기 바란다. 이 문서는 API 정복 17장의 내용을 보강하여 다시 작성한 것이다. 여기서는 기본적인 내용은 알고 있다고 가정하고 코드에 대한 상세한 설명은 하지 않는다. 다음 절의 상태란도 마찬가지이다.

TBBUTTON 구조체는 툴 바에 포함되는 툴 버튼에 대한 정보를 가지는데 크기 13 ToolBtn배열에 10개의 버튼과 3개의 구분자를 정의하였다. ToolBtn 배열을 보면 각 툴 버튼이 어떤 이미지를 사용하고 어떤 ID를 가지는지와 적용된 스타일, 초기 상태에 대한 정보를 얻을 수 있으며 이 배열의 초기값을 변경함으로써 툴 버튼의 속성을 조정할 수 있다.

szToolText에는 각 툴 버튼의 아래쪽에 나타날 텍스트가 여러 개의 널 종료문자열 배열로 정의되어 있다. 첫 번째 버튼의 아래쪽에 새파일, 두 번째 버튼의 아래쪽에 열기라는 설명이 나타날 것이며 이 배열의 문자열을 수정하면 버튼의 텍스트가 변경된다. CreateToolBar 함수는 bBig 인수에 따라 이미지의 크기별로 두 종류의 툴 바를 생성할 수 있으며 bText 인수로 텍스트 출력 여부를 전달받는다. 따라서 생성 가능한 툴바의 조합은 4가지이다. 리소스에는 크기별로 다음 두 이미지가 작성되어 있다.

일반적으로 많이 사용되는 친숙한 모양의 이미지를 사용했는데 사실 자동개행 버튼의 이미지만 직접 만든 것이고 나머지는 공통 컨트롤 라이브러리에서 살짝 훔쳐온 것이다. 공통 컨트롤 라이브러리에는 자주 사용되는 툴 버튼의 이미지들이 크기별로 미리 작성되어 있으므로 가져와 사용하기만 하면 된다.

bBig 인수에 따라 이미지의 크기와 이미지 리소스의 ID를 결정한 후 CreateToolbarEx 함수로 툴 바를 생성한다. 그리고 bText인수가 TRUE이면 TB_ADDSTRING 메시지를 보내 툴 버튼에 텍스트를 추가하였다. ToolBtn iString 멤버에는 등록된 텍스트의 인덱스가 이미 지정되어 있다. 이 텍스트가 보이는가 보이지 않는가는 툴바에 텍스트가 등록되는가 아닌가에 따라 달라지므로 TB_ADDSTRING 메시지로 텍스트를 등록하면 보이게 되고 그렇지 않으면 텍스트 없이 툴 버튼이 생성된다.

툴바의 두 옵션은 실행중에 변경할 수 있는데 옵션이 바뀌면 변경된 옵션으로 툴바를 다시 만든다. 그래서 이미 툴바가 있으면 DestroyWindow 함수로 기존 툴바를 먼저 파괴하는 코드가 있고 툴바의 옵션을 바꾼 후 TB_AUTOSIZE 메시지를 보내 변경된 크기를 재계산하도록 하였다. ApplyNow에서는 이 옵션들이 변경되었을 때 CreateToolBar 함수를 다시 호출한다.

 

void ApplyNow()

{

     HWND hChild;

     SInfo *pSi;

     HDC hdc;

     LOGFONT tFont;

     BOOL bChangeStyle;

    BOOL bRelayout=FALSE;

 

     ....

 

    if (Option.bToolBarBig != NewOption.bToolBarBig ||

        Option.bToolBarText != NewOption.bToolBarText) {

        CreateToolBar(NewOption.bToolBarText,NewOption.bToolBarBig);

        bRelayout=TRUE;

        InvalidateRect(hFileWnd,NULL,TRUE);

    }

 

    if (Option.bShowFileTab != NewOption.bShowFileTab ||

        Option.bShowFileWnd != NewOption.bShowFileWnd ||

        Option.bShowStatus != NewOption.bShowStatus ||

        Option.bShowToolBar != NewOption.bShowToolBar ||

        Option.bShowOutput != NewOption.bShowOutput) {

        bRelayout=TRUE;

    }

 

     hChild=GetWindow(g_hMDIClient,GW_CHILD);

     while (hChild) {

     ....

     Option=NewOption;

    if (bRelayout) {

        Relayout();

    }

}

 

이미지 크기나 텍스트 출력 여부 중 하나라도 바뀌면 툴바를 다시 만든다. 툴바의 크기가 늘어나면 파일창의 일부가 갱신되지 못하는 문제가 있어 파일창 전체를 무효화하였다. 그리고 툴바를 포함하여 차일드 다섯 개의 보기 상태중 단 하나라도 변경되면 Relayout으로 차일드를 재배치한다. 차일드 보기 옵션은 기본 설정 대화상자에는 없지만 권장옵션 버튼에 의해 초기화될 수 있기 때문에 ApplyNow에서 이 처리를 꼭 해야 한다.

옵션이 바뀔 때마다 툴바를 다시 만들지 않고 이미지 크기만 다시 지정하는 것은 가능하다. 그러나 실행중에 등록된 텍스트를 변경하는 것이 너무 까다로워 옵션 변경시 아예 툴바를 다시 만들었다.