1. 사용할 메뉴를 생성하고 ID를 지정합니다.
위의 그림은 제가 하고 있는 프로그램에서 사용하는 메뉴를 직샷해서 넣었습니다. 사용자의 마음데로 생성해주세요.
2. 이번에는 Toolbar와 메뉴의 ID를 맞춰주어 같은 역할을 할수 있게 해줍니다.
원하는 툴바 버튼을 선택후 속성창에서 변경해 줍니다.
3. 메뉴와 툴바의 아이디를 매핑시켰다면 매킹시킨 메뉴의 이벤트를 생성합니다.
현재 위 이벤트를 모두 추가해 놓은 상태이기 때문에 Add and Edit 버튼이 비활성화 되어 있습니다. COMMAND와 UPDATE_COMMAND_UI를 App파일에 추가합니다.
-
COMMAND : 메뉴에 대한 코딩을 합니다. 클릭시 이벤트 정의.
-
UPDATE_COMMAND_UI : 메뉴를 활성화/비활성화 하는 것과 같은 메뉴에 대한 UPDATE를 제공합니다.
아래의 그림은 App.cpp 파일을 보게 되면 이벤트가 추가된 코드 입니다.
현재 제가 제작하고 있는 프로그램에서 직접 가져왔기때문에 쓸데 없는 코드들이 좀 들어있습니다.
이렇게 메뉴를 추가하는 이유는 이렇게 해야 툴바와 메뉴가 모두 사용할수 있게 활성화 되기 때문입니다.
4. 3개의 이미지(비트맵)를 준비 합니다. (아이콘의 크기는 32X32로 정하고 아이콘을 그렸습니다.)
-
백그라운드 이미지
-
활성화 이미지
-
비활성화 이미지
5. 리소스에 이미지를 등록합니다.
6. CToolBar를 상속받은 클래스를 하나 생성합니다.
생성 후 WM_ERASEBKGND 메시지를 추가하고 아래와 같이 코딩합니다.
7. MainFram.cpp 파일에 OnCreate()메서드에 아래와 같이 코딩합니다.
코딩 전에 꼭 위에서 CToolbar클래스를 상송받은 클래스 객체를 헤더에 생성해 줘야 합니다. 저같은 경우 원래의 객체 이름 그대로를 사용했습니다.
1) 툴바로딩하는 부분의 속성을 아래와 같이 변경합니다.
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) ) //!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) { TRACE0("도구 모음을 만들지 못했습니다.\n"); return -1; // 만들지 못했습니다. } |
2) 툴바의 버튼의 갯수를 정합니다. 여기서 SetButtons()에서 버튼 갯수를 지정해야 밑에서 텍스트와 메뉴 매핑이 가능합니다. 만약에 사
용 버튼 갯수와 밑에 Toolbar버튼 인덱스가 틀려질 경우는 런타임 에러가 발생하니 참고 하세요.
3) 버튼의 스타일을 정의 합니다.
UINT uButtonStyle = BTNS_BUTTON | BTNS_SHOWTEXT; UINT uButtonStyleEX = TBSTYLE_EX_DRAWDDARROWS | TBSTYLE_EX_MIXEDBUTTONS; |
4) 아래 주석처럼 툴바의 확장 스타일을 정의하고 이미지와 버튼의 크기를 명시합니다.
//CToolBarCtrl& ToolBarCtrl = m_wndToolBar.GetToolBarCtrl(); m_wndToolBar.SetSizes(CSize(32, 32), CSize(32, 32)); m_wndToolBar.SetHeight(32); |
5) 각 버튼의 텍스트를 성정하고, 각 툴바 버튼의 인덱스 번호를 맞추고 메뉴를 매핑시킵니다.
-
SetButtonText( 툴바 인덱스 ( 툴바는 맨 앞이 인덱스 0으로 시작합니다. ), 메뉴 이름을 정합니다 );
-
SetButtonInfo( 툴바 버튼 인덱스, 메뉴 ID, 위에서 설정한 스타일, 인덱스 ); 버튼에 정보를 정의한다.
6) 마지막 핵심 코드 입니다.
-
비트맵을 로드합니다.
-
이미지 리스트를 생성합니다.
-
생성된 리스트에 비트맵을 추가합니다.
-
센드 메시지를 통해서 TB_SETIMAGELIST로 이미지 리스트의 핸들을 보내 툴바 버튼이 활성화 되었을 경우 IDB_BMP_Toolbar_Hot이미지를 표시 하게 합니다.
-
TB_SETDISABLEDIMAGELIST로 보낼경우 비활성화 상태에서 IDB_BMP_Tolbar_Normal로 메시지를 보내게됩니다.
CImageList imageList; m_bitMap.LoadBitmap(IDB_TOOLBAR); // 비트맵을 로드한다. imageList.Create(32, 32, ILC_COLOR | ILC_MASK, 6, 0); imageList.Add(&m_bitMap, RGB(255, 0, 255)); m_wndToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList); imageList.Detach(); m_bitMap.Detach(); |
8. 마지막으로 결과 화면. ToobBar의 모양이 트루컬러 이미지로 바뀌었죠? 이쁘게?ㅋ 지금 흑백이미지는 비활성화 상태의이미지입니다.
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
Toolbar & Menu (0) | 2012.02.09 |
---|---|
기존 MFC UI 에 리본바 적용하기 (0) | 2012.01.25 |
모달리스 창이 항상 위에 있는 문제 해결 (0) | 2011.12.16 |
Slider 포커스 이동 - 슬라이더 (0) | 2011.12.16 |
드레그 앤 드랍 (Drag and Drop) 구현 - 리스트 (0) | 2011.12.16 |
댓글