본문 바로가기

3.구현/VC++

[MFC] 256색 이상 툴바 사용

작성자: Ospace (ospace114 at naver.com) http://discount77.com/blog/ospace

이 예제는 이미지 리스트를 이용해서 도구바에 등록하는 형태이다.
기본적으로 CMainFrame의 OnCreate()에서 코딩을 한다.

작업순서는

  1. 툴바 버튼 기본 모양 지정
  2. 이미지 리스트 생성 및 툴바에 등록
  3. 각 버튼들 설정

실제 코딩을 보자.. 기본적으로 사용할 자료형이다.

CImageList img; // 이미지리스트
CString str; // 버튼 설명문을 임시 저장
CRect rectToolBar; // 툴바 크기 설정 임시 저장

툴바 버튼 기본 모양 설정

//버튼의 최대, 최소 크기설정
//최대는 버튼 설명문이 포함될 경우 최대 크기이다.
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);

// 버튼 확장 스타일 지정  
// TBSTYLE_EX_DRAWDDARROWS - 버튼 오른쪽에 드랍다운용 화살표 버튼을 생성하게 한다 m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);

이미지 리스트 생성 및 비트맵 등록

// 이미지 리스트에 IDB_MAINFRAME 비트맵을 등록
// 당연히 비트맵은 사전에 등록되어 있어야 한다
// 비트맵 가로, 세로 크기는 20으로 한다 (이는 변경가능)
// 22는 이미지 리스트에 있는 각각 비트맵 가로폭, 0은 한번에 추가할 수 있는 이미지 수, 다음 RGB()은 투명 마스크로 사용할 색 
img.Create(IDB_MAINFRAME, 22, 0, RGB(255, 0, 255));
// 툴바에 생성된 이미지 리스트를 등록
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
// 이미지 리스트에서 비트맵 정보 제거
// 툴바에 이미 저장되었기에 이미지 리스트의 비트맵은 필요없음
img.Detach();
// 호버 기능을 추가하고 싶으면 호버용 새로운 비트맵을 추가하고 SetHotImageList()이용해서 툴바에 등록한다
img.Create(IDB_HOTMAINFRAME, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();

각 버튼들 설정

버튼 설정 전에 기본 설정을 해보자.

// 툴바 버튼모양 : TBSTYLE_FLAT는 이미지밑에 문자열표시
// 아이콘 옆으로 표시되려면 TBSTYLE_LIST로 하면된다
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
// 사용할 버튼수를 2개로 정한다
m_wndToolBar.SetButtons(NULL, 2);
//첫번째 버튼(인덱스:0)에 사용할 버튼 ID는 ID\_FILE\_NEW로 하고 모양은 일반적인 버튼모양(TBSTLE\_BUTTON)으로 하고, 이미지 리스트에서 버튼 이미지로 사용할 인텍스는 0이다  
m_wndToolBar.SetButtonInfo(0, ID_FILE_NEW, TBSTYLE_BUTTON, 0);  
// 리소스 String Table에서 사용할 스트링 정보를 str에 로드  
str.LoadString(IDS_FILENEW);
// 앞에서 가져온 문자열을 해당 버튼(0)의 툴팁으로 등록
m_wndToolBar.SetButtonText(0, str);

이렇게 해서 계속 해당 계수 만큼 등록한다. 여기에서는 2개로 됨.

// 다음은 계속 추가시 버튼 오른쪽에 드랍다운용 화살표 버튼이 생기는 것을 표시한 버튼 예제  
m_wndToolBar.SetButtonInfo(6, ID_FAVORITES_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 6);  
str.LoadString(IDS_FAVORITES);
m_wndToolBar.SetButtonText(6, str);

버튼 설정하는 다른 방법

각 버튼 모양에 해당하는 ID를 배열에 넣는다. 그리고, 버튼 중간에 공배(줄)을 넣고 싶으면 ID_SEPARATOR을 추가한다.
다음은 코드는 소스 맨 처음에 넣어 주면된다.

static UINT BASED\_CODE MainButtons[] =  
{  
ID_FILE_LOGIN,  
ID_SEPARATOR,  
ID_FILE_START,  
ID_FILE_STOP  
};

OnCreate()의 정당한 곳에 다음을 넣어준다.

m_wndToolBar.SetButtons(MainButtons, sizeof(MainButtons)/sizeof(UINT));

해당 버튼에 대한 설명을 아래에 붙이는 것을 하고 싶다면 1이 없는 것은 ID_SEPARATOR에 해당하는 부분으로 건너뛰면 된다. 즉 ID_SEPARATOR는 각 버튼 인덱스 중간에 추가되었다고 보면 된다.

// 리소스 String Table에서 사용할 스트링 정보를 str에 로드  
str.LoadString(IDS_FILENEW);  
// 앞에서 가져온 문자열을 해당 버튼(0)의 툴팁으로 등록  
m_wndToolBar.SetButtonText(0, str);  
// 리소스 String Table에서 사용할 스트링 정보를 str에 로드  
str.LoadString(IDS_FILESTRT);  
// 앞에서 가져온 문자열을 해당 버튼(2)의 툴팁으로 등록  
m_wndToolBar.SetButtonText(2, str);

참고

[1] Visual C++ .NET 2003\mfc\internet\mfcie Samples

반응형