. 표준 비트맵 사용하기

툴 바를 만드려면 먼저 툴 버튼에 표시할 비트맵부터 만들어야 한다. 텍스트만으로도 툴바를 만들 수 있지만 무척 썰렁하기 때문에 그런 툴바를 만드는 경우는 무척 드물며 대부분 예쁜 이미지를 그려 넣는다. 그런데 사실 툴 바에 들어가는 버튼들은 거의 대부분 새파일, 열기, 저장, 잘라내기, 복사, 붙이기 등의 순서대로 되어 있다.

이런 툴바의 구성은 거의 표준화된 것이고 사용자들도 툴바에는 당연히 이런 명령들이 있기를 기대한다. 이런 일반적인 버튼은 누가 만들어도 거의 비슷한 모양을 가지며 매번 만들려면 아주 귀찮은데 누군가가 한번만 잘 만들어 놓으면 모두가 편하게 쓸 수 있을 것이다.

그래서 공통 컨트롤 라이브러리는 아예 DLL에 이런 자주 사용하는 비트맵들을 미리 만들어서 제공하는데 이 비트맵을 표준 비트맵이라고 한다. 종류와 크기별로 모두 여섯개의 비트맵이 제공되며 각 비트맵안에는 다음과 같은 이미지들이 작성되어 있다. 각 이미지가 어떤 모양으로 만들어져 있는지는 직접 툴바에 넣어 보면 알 수 있겠지만 이름만으로도 그 모양은 쉽게 유추가 가능하다.

 

비트맵

이미지

IDB_HLIST_LARGE_COLOR

IDB_HLIST_SMALL_COLOR

HIST_ADDTOFAVORITES

HIST_BACK

HIST_FAVORITES

HIST_FORWARD

HIST_VIEWTREE

IDB_STD_LARGE_COLOR

IDB_STD_SMALL_COLOR

STD_COPY

STD_CUT

STD_DELETE

STD_FILENEW

STD_FILEOPEN

STD_FILESAVE

STD_FIND

STD_HELP

STD_PASTE

STD_PRINT

STD_PRINTPRE

STD_PROPERTIES

STD_REDOW

STD_REPLACE

STD_UNDO

IDB_VIEW_LARGE_COLOR

IDB_VIEW_SMALL_COLOR

VIEW_DETAILS

VIEW_LARGETICONS

VIEW_LIST

VIEW_NETCONNECT

VIEW_NETDISCONNECT

VIEW_NEWFOLDER

VIEW_PARENTFOLDER

VIEW_SMALLICONS

VIEW_SORTDATE

VIEW_SORTNAME

VIEW_SORTSIZE

VIEW_SORTTYPE

 

이 표준 이미지를 사용하고 싶으면 CreateToolBarEx 함수의 hInstance 인수에 HINST_COMMCTRL값을 주고 비트맵 이름을 지정해 주면 된다. 물론 TBBUTTON 구조체의 iBitmap 멤버에는 이 비트맵에 들어 있는 이미지들을 기록해 주어야 한다. 다음 예제는 이런 방법으로 리소스 없이 툴 바를 만든 것이다.

 

#include <commctrl.h>

#define ID_TOOLBAR 100

HWND hToolBar;

BOOL bBig;

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

{

   HDC hdc;

   PAINTSTRUCT ps;

   TCHAR Mes[]="마우스 왼쪽 버튼을 누르면 버튼의 크기가 바뀝니다.";

   TBBUTTON ToolBtn[20]={

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

      {STD_FILEOPEN,11,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_FILESAVE,12,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {4,0,0,TBSTYLE_SEP,0,0,0,0},

      {STD_CUT,13,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_COPY,14,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_PASTE,15,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_DELETE,16,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {4,0,0,TBSTYLE_SEP,0,0,0,0},

      {STD_UNDO,17,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_REDOW,18,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {4,0,0,TBSTYLE_SEP,0,0,0,0},

      {STD_PRINT,19,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_PRINTPRE,20,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {4,0,0,TBSTYLE_SEP,0,0,0,0},

      {STD_FIND,21,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_REPLACE,22,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {STD_PROPERTIES,23,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {4,0,0,TBSTYLE_SEP,0,0,0,0},

      {STD_HELP,24,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0}

   };

 

   switch(iMessage) {

   case WM_CREATE:

      hWndMain=hWnd;

      InitCommonControls();

      bBig=FALSE;

      hToolBar=CreateToolbarEx(hWndMain, WS_CHILD | WS_VISIBLE | WS_BORDER,

          ID_TOOLBAR, 15, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, ToolBtn, 20,

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

      return 0;

   case WM_LBUTTONDOWN:

      TBREPLACEBITMAP rb;

      int bx,by;

      bBig=!bBig;

      rb.hInstOld=rb.hInstNew=HINST_COMMCTRL;

      if (bBig) {

          rb.nIDOld=IDB_STD_SMALL_COLOR;

          rb.nIDNew=IDB_STD_LARGE_COLOR;

          bx=24;by=23;

      } else {

          rb.nIDOld=IDB_STD_LARGE_COLOR;

          rb.nIDNew=IDB_STD_SMALL_COLOR;

          bx=16;by=15;

      }

      rb.nButtons=15;

 

      SendMessage(hToolBar,TB_REPLACEBITMAP,0,(LPARAM)&rb);

      SendMessage(hToolBar,TB_SETBITMAPSIZE,0,(LPARAM)MAKELONG(bx,by));

      SendMessage(hToolBar,TB_AUTOSIZE,0,0);

      return 0;

   case WM_PAINT:

      hdc=BeginPaint(hWnd, &ps);

      TextOut(hdc,10,50,Mes,lstrlen(Mes));

      EndPaint(hWnd, &ps);

      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));

}

 

WM_CREATE에서 툴 바를 만드는데 HINST_COMMCTRL 인스턴스의 IDB_STD_SMALL_COLOR 비트맵을 사용하고 있다. ToolBtn 배열에는 이 비트맵에 들어 있는 이미지의 인덱스들이 기입되어 있다. 실행해 보면 다음과 같은 툴바가 나타날 것이다.

흔히 많이 보는 일반적인 모양의 툴바인데 비트맵을 만들지 않고도 이런 잘 만들어진 이미지를 쓸 수 있다는 것은 참 멋진 일이다. 물론 표준 이미지에 우리가 필요로 하는 모든 비트맵이 다 들어 있는 것은 아니지만 말이다. 만약 표준 이미지와 직접 만든 이미지를 같이 쓰고 싶다면 각 버튼을 개별적으로 추가해 주어야 한다. 비트맵별로 TBBUTTONS 구조체 배열을 따로 만들고 TB_ADDBUTTONS 메시지를 여러 번 보내 주면 된다.

마우스 왼쪽 버튼을 누르면 큰 이미지로 바꾸어 주도록 했다. 어차피 공짜로 쓸 수 있는 비트맵이므로 큰 이미지도 사용해 보도록 하자. 비트맵을 바꿀 때는 TBREPLACEBITMAP 구조체에 변경하고자 하는 비트맵을 가진 인스턴스 핸들과 비트맵 ID를 대입한 후 TB_REPLACEBITMAP 메시지를 보낸다. 이 메시지를 보낸 후 TB_SETBITMAPSIZE 메시지를 보내 비트맵의 크기가 변경되었음을 알려 주고 TB_AUTOSIZE  메시지로 툴바가 크기를 조정할 수 있도록 해 주어야 한다.