. 핫 트래킹

핫 트래킹 기능이란 마우스가 버튼 위에 있을 때 버튼이 선택되어 있음을 보여주는 기능이다. 핫(Hot) 상태란 마우스로 컨트롤을 선택한 것은 아니지만 선택하기 바로 직전의 상황을 의미하며 보통 상태와는 약간 다른 모습을 가진다. 기본적으로 TBSTYLE_FLAT 스타일을 가지는 툴바는 핫 트래킹 기능이 있으며 마우스가 버튼 위에 있으면 버튼 주위에 경계선이 나타난다. 이런 디폴트 처리외에 아예 이미지 자체를 바꾸고 싶다면 그렇게 할 수도 있다.

핫 상태에서 다른 이미지를 보여 주도록 하고 싶다면 이미지 리스트를 사용해야 한다. 비트맵으로는 핫 상태를 표현할 수 없다. 툴 바는 보통, 핫, 사용금지 세가지 종류의 이미지 리스트를 등록할 수 있으며 버튼의 상태에 따라 다른 모양의 이미지를 보여줄 수 있다. 리소스에 다음 세가지 비트맵을 정의한다.

  

제일 왼쪽은 보통 상태, 빨간색 배경은 핫 상태, 검정색 배경은 사용 금지된 상태를 나타낸다. 이미지를 간단하게 만들기 위해 색상으로 구분했지만 아예 다른 이미지를 그릴 수도 있다. 예를 들어 보통 상태에서는 작은 돋보기, 핫 상태에서는 큰 돋보기, 사용 금지 상태에서는 깨진 돋보기를 그려 넣는다면 아주 보기 좋다. 코드는 다음과 같다.

 

#include <commctrl.h>

#include "resource.h"

#define ID_TOOLBAR 100

HWND hToolBar;

HIMAGELIST hNormal, hHot, hDisable;

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

{

   TBBUTTON ToolBtn[3]={

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

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

      {2,12,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0}

   };

 

   switch(iMessage) {

   case WM_CREATE:

      InitCommonControls();

      hToolBar=CreateWindow(TOOLBARCLASSNAME,NULL,WS_CHILD | WS_VISIBLE | WS_BORDER

          | TBSTYLE_FLAT,0,0,0,0,

          hWnd,(HMENU)ID_TOOLBAR,g_hInst,NULL);

      SendMessage(hToolBar,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);

 

      hNormal=ImageList_LoadImage(g_hInst, MAKEINTRESOURCE(IDB_NORMAL),

          16, 1, CLR_NONE,IMAGE_BITMAP,0);

      hHot=ImageList_LoadImage(g_hInst, MAKEINTRESOURCE(IDB_HOT),

          16, 1, CLR_NONE,IMAGE_BITMAP,0);

      hDisable=ImageList_LoadImage(g_hInst, MAKEINTRESOURCE(IDB_DISABLE),

          16, 1, CLR_NONE,IMAGE_BITMAP,0);

      SendMessage(hToolBar,TB_SETIMAGELIST,0,(LPARAM)hNormal);

      SendMessage(hToolBar,TB_SETHOTIMAGELIST,0,(LPARAM)hHot);

      SendMessage(hToolBar,TB_SETDISABLEDIMAGELIST,0,(LPARAM)hDisable);

      SendMessage(hToolBar,TB_ADDBUTTONS,(WPARAM)3,(LPARAM)ToolBtn);

      return 0;

   case WM_COMMAND:

      switch (LOWORD(wParam)) {

      case 10:

          SendMessage(hToolBar,TB_SETSTATE,12,MAKELONG(0,0));

          break;

      case 11:

          SendMessage(hToolBar,TB_SETSTATE,12,MAKELONG(TBSTATE_ENABLED,0));

          break;

      case 12:

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

          break;

      }

      return 0;

   case WM_SIZE:

      SendMessage(hToolBar,TB_AUTOSIZE,0,0);

      return 0;

   case WM_DESTROY:

      ImageList_Destroy(hNormal);

      ImageList_Destroy(hHot);

      ImageList_Destroy(hDisable);

      PostQuitMessage(0);

      return 0;

   }

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

}

 

먼저 CreateWindow 함수로 툴바 컨트롤을 만들되 핫 트래킹이 가능하려면 TBSTYLE_FLAT 스타일을 반드시 주어야 한다. 툴바는 버튼의 이미지로 비트맵이나 이미지 리스트 둘 중 하나를 쓸 수 있는데 둘 다 동시에 사용할 수는 없다. 따라서 툴바 생성과 함께 비트맵을 등록하는 CreateToolBarEx 함수로 툴바를 만들어서는 이미지 리스트를 사용할 수 없으며 반드시 CreateWindow 함수로 툴 바를 생성해야 한다.

비트맵으로부터 이미지 리스트를 생성한 후 TB_SETIMAGELIST 등의 메시지로 이미지 리스트를 툴바에 등록한다. 이때 어떤 메시지로 이미지 리스트를 등록하는가에 따라 보통, 핫, 사용 금지 상태의 이미지가 된다. 툴바는 버튼의 상태에 따라 적절한 이미지를 자동으로 선택해서 사용하게 된다. 실행해 보면 마우스가 버튼 위로 올라갈 때 버튼의 이미지가 빨간색으로 변할 것이다. 1번 버튼을 누르면 3번 버튼이 사용금지되며 2번 버튼을 누르면 3번 버튼이 사용 가능해지는데 이때도 적절한 이미지가 표시된다.

툴바에 등록된 이미지 리스트는 자동으로 파괴되지 않으므로 반드시 직접 파괴해 주어야 한다. 예제에서는 WM_DESTROY에서 이미지 리스트를 파괴하고 있다.