. 툴바에 텍스트 넣기

툴 버튼은 보통 이미지만 가지지만 텍스트를 같이 가질 수도 있고 텍스트만 가질 수도 있다. 툴 버튼에 텍스트를 출력하려면 각각의 버튼에 나타날 텍스트를 제공해 주어야 한다. 버튼에 텍스트를 제공하는 방법은 두 가지가 있다.

첫번째는 TB_ADDSTRING 메시지를 사용하여 툴 바에 문자열을 등록하는 것이다. 툴 바는 일종의 텍스트 배열을 관리하며 이 메시지로 텍스트 배열을 등록한다. wParam으로는 문자열 리소스를 가지는 인스턴스 핸들을 주되 문자열 리소스를 사용하지 않으면 NULL로 지정한다. lParam에는 문자열 리소스의 ID 또는 문자열의 포인터를 곧바로 전달한다. 이때 문자열은 여러 개의 널 종료 문자열을 가지는 문자열 배열이어야 하며 마지막 문자열은 두 개의 NULL로 끝나도록 한다. 이 메시지를 사용하면 여러 개의 문자열을 한꺼번에 등록할 수 있다.

툴바는 이렇게 등록된 문자열을 내부적인 배열로 관리하며 각 문자열은 0부터 시작하는 인덱스로 지정한다. 문자열을 툴 바에 등록하고 TBBUTTON 구조체의 iString 멤버에 문자열의 인덱스를 대입해 주면 된다. 버튼을 먼저 등록한 후 문자열을 나중에 등록해도 상관없다. 어차피 툴바가 보이기 전에 두가지 정보가 완비되기만 하면 된다.

두번째 방법은 TB_SETBUTTONINFO 메시지로 각 개별 버튼에 문자열을 등록하는 것이다. 이 메시지는 버튼의 문자열뿐만 아니라 상태, 스타일, 명령 ID, 이미지, 폭 등 버튼의 모든 정보를 변경할 수 있다. wParam으로 버튼의 명령 ID를 전달하고 lParam으로는 버튼의 정보를 지정하는 다음 구조체의 포인터를 전달한다.

 

typedef struct {

    UINT cbSize;

    DWORD dwMask;

    int idCommand;

    int iImage;

    BYTE fsState;

    BYTE fsStyle;

    WORD cx;

    DWORD_PTR lParam;

    LPTSTR pszText;

    int cchText;

} TBBUTTONINFO, *LPTBBUTTONINFO;

 

이 구조체에 변경하고자 하는 버튼의 속성을 설정한 후 TB_SETBUTTONINFO 메시지를 보내면 된다. 버튼의 속성을 조사할 때는 이 구조체에 조사하고 싶은 값을 설정한 후 TB_GETBUTTONINFO 메시지를 보낸다.

cbSize는 이 구조체의 크기이며 구조체 버전 확인에 사용되므로 메시지를 보내기 전에 반드시 대입해 주어야 한다. dwMask는 버튼의 어떤 속성을 변경 또는 조사할 것인가를 지정하는 다음 플래그의 조합이다. dwMask의 값에 따라 TBBUTTONINFO 구조체의 어떤 멤버들이 유효한 값을 가지는가가 결정된다.

 

플래그

설명

TBIF_COMMAND

명령 ID를 변경한다.

TBIF_IMAGE

이미지를 변경한다.

TBIF_LPARAM

사용자 정의 데이터를 변경한다.

TBIF_SIZE

버튼의 폭을 변경한다.

TBIF_STATE

버튼의 상태를 변경한다.

TBIF_STYLE

버튼의 스타일을 변경한다.

TBIF_TEXT

버튼의 텍스트를 변경한다.

 

나머지 멤버들은 여러 가지 버튼의 정보를 가지는데 멤버 이름 자체가 아주 설명적이다. fsStyle 멤버는 버튼의 스타일, cx는 버튼의 폭, pszText는 버튼의 텍스트이다. 이 방법으로 버튼의 텍스트를 지정하려면 dwMask에 TBIF_TEXT를 대입하고 pszText에 문자열 포인터를 전달하면 된다.

이 두 방법으로 버튼에 텍스트를 출력하는 예제를 만들어 보자. 다음 예제는 3개의 버튼은 TB_ADDSTRING으로 등록한 문자열을 출력하였고 1개의 버튼은 TB_SETBUTTONINFO 메시지로 문자열을 출력하였다.

 

#include <commctrl.h>

#include "resource.h"

#define ID_TOOLBAR 100

HWND hToolBar;

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

{

   TBBUTTON ToolBtn[5]={

      {0,10,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {1,11,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,1},

      {5,0,0,TBSTYLE_SEP,0,0,0,0},

      {2,12,TBSTATE_ENABLED | TBSTATE_CHECKED,TBSTYLE_CHECKGROUP,0,0,0,2},

      {3,13,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,0}

   };

   TCHAR *szString="첫번째\0두번째\0세번째\0";

   TBBUTTONINFO bi;

 

   switch(iMessage) {

   case WM_CREATE:

      InitCommonControls();

      hToolBar=CreateToolbarEx(hWnd, WS_CHILD | WS_VISIBLE | WS_BORDER

          | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,

          ID_TOOLBAR, 4, g_hInst, IDB_BITMAP1, ToolBtn, 5,

         16,16,16,16,sizeof(TBBUTTON));

      SendMessage(hToolBar,TB_ADDSTRING,NULL,(LPARAM)szString);

 

      bi.cbSize=sizeof(TBBUTTONINFO);

      bi.dwMask=TBIF_TEXT;

      bi.pszText="메롱";

      SendMessage(hToolBar,TB_SETBUTTONINFO,13,(LPARAM)&bi);

 

      return 0;

   case WM_COMMAND:

      switch (LOWORD(wParam)) {

      case 10:

          MessageBox(hWnd,"첫번째 버튼을 선택했습니다","알림",MB_OK);

          break;

      case 11:

          MessageBox(hWnd,"두번째 버튼을 선택했습니다","알림",MB_OK);

          break;

      }

      return 0;

   case WM_NOTIFY:

      switch (((LPNMHDR)lParam)->code) {

      case TTN_GETDISPINFO:

          switch (wParam) {

          case 10:

             ((LPNMTTDISPINFO)lParam)->lpszText="장남 버튼입니다.";

             break;

          case 11:

             ((LPNMTTDISPINFO)lParam)->lpszText="귀염둥이 둘째 딸입니다.";

             break;

          case 12:

          case 13:

             ((LPNMTTDISPINFO)lParam)->lpszText="쌍둥이 막내들입니다.";

             break;

          }

      }

      return 0;

   case WM_SIZE:

      SendMessage(hToolBar,TB_AUTOSIZE,0,0);

      return 0;

   case WM_DESTROY:

      PostQuitMessage(0);

      return 0;

   }

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

}

 

ToolBtn 배열의 마지막 멤버인 iString은 차례대로 0,1,2라는 값으로 초기화되었다. 즉 첫번째 버튼은 0번 인덱스의 문자열을, 두번째 버튼은 1번 인덱스의 문자열을 출력한다는 뜻이다. 툴바를 먼저 만든 후 TB_ADDSTRING 메시지로 버튼에 사용할 문자열 배열 szString을 전달하였다. 이 문자열은 세 개의 널 종료 문자열을 배열로 가지고 있으며 앞쪽부터 차례대로 인덱스 0,1,2 문자열로 등록된다.

네번째 버튼의 텍스트는 ToolBtn 배열에서 초기화되지 않았으나 TB_SETBUTTONINFO 메시지로 "메롱"이라는 문자열을 제공했다. 이 메시지를 사용하면 언제든지 툴 버튼의 텍스트를 변경할 수 있다. 실행 결과는 다음과 같다.

툴바의 아래쪽에 문자열이 출력되어 있으며 버튼은 텍스트의 폭에 맞게 확장된다. 툴바의 스타일을 변경하면 오른쪽에 텍스트가 나타나도록 할 수도 있다.