SPRING :: NOTE

[XTToolkitPro] RibbonBar 및 아이콘 만들기 본문

Development Tools/XtremeToolkit Pro

[XTToolkitPro] RibbonBar 및 아이콘 만들기

RAYZIE 2016. 10. 11. 10:26
반응형

리본바를 만들어보겠다.

XTToolkit의 테마때문에 많은 삽질 끝에, 만들긴 하였는데. 이렇게 만드는게 잘한 방법인지는 모르겠다.


1. XTToolkit 프로젝트 생성 (이전 포스팅 참조)


OnCreate 부분에 아래 소스를 추가

// 자동생성
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
	return -1;

if (!m_wndStatusBar.Create(this) ||
	!m_wndStatusBar.SetIndicators(indicators,
	  sizeof(indicators)/sizeof(UINT)))
{
	TRACE0("Failed to create status bar\n");
	return -1;      // fail to create
}

// Initialize the command bars
if (!InitCommandBars())
	return -1;

CXTPCommandBars* pCommandBars = GetCommandBars();
m_wndStatusBar.SetCommandBars(pCommandBars);

if (!CreateRibbonBar())
{
	TRACE0("Failed to create ribbon\n");
	return -1;
}

// Set Office 2003 Theme
GetCommandBars()->SetAllCaps(TRUE);
Load2013Icons();
SetCommandBarsTheme(xtpThemeOffice2013, theApp.m_hModule2013, _T("OFFICE2013WHITE.INI"));
CXTPRibbonBar *pRibbonBar = (CXTPRibbonBar*)GetCommandBars()->GetMenuBar();
pRibbonBar->GetSystemButton()->SetStyle(xtpButtonCaption);

m_paneManager.InstallDockingPanes(this);
m_paneManager.SetTheme(xtpPaneThemeVisualStudio2010);
m_paneManager.HideClient(TRUE);

// Create docking panes.
CXTPDockingPane* pwndPane1 = m_paneManager.CreatePane(
	IDR_PANE_OPTIONS, CRect(0, 0,50, 50), xtpPaneDockLeft);
CXTPDockingPane* pwndPane2 = m_paneManager.CreatePane(
	IDR_PANE_PROPERTIES, CRect(0, 0,50, 50), xtpPaneDockRight);

// Set the icons for the docking pane tabs.
int nIDIcons[] = { IDR_PANE_OPTIONS, IDR_PANE_PROPERTIES};
	m_paneManager.SetIcons(IDB_BITMAP_ICONS, nIDIcons,
	_countof(nIDIcons), RGB(0, 255, 0));

이 소스에서 오피스2013테마를 적용하는데, 샘플 예제에서는 FILE MENU 이벤트를 이용해

option theme를 바꿔주는 법을 몰라, 테마 변경 부 이벤트에서 막바로 소스를 가져왔다.

급하고 짜증났기때문에....


그 다음은 OnCreate안에 있는 리본바 생성 함수를 만들어준다.
BOOL CMainFrame::CreateRibbonBar()
{
	CXTPCommandBars* pCommandBars = GetCommandBars();

	CMenu menu;
	menu.Attach(::GetMenu(m_hWnd));
	SetMenu(NULL);
	CXTPRibbonBar* pRibbonBar = (CXTPRibbonBar*)pCommandBars->Add(_T("The Ribbon"), xtpBarTop, RUNTIME_CLASS(CXTPRibbonBar));
	if (!pRibbonBar)
	{
		return FALSE;
	}
	pRibbonBar->EnableDocking(0);

	CXTPControlPopup* pControlFile = (CXTPControlPopup*)pRibbonBar->AddSystemButton(IDR_MAINFRAME);
	pControlFile->SetCommandBar(menu.GetSubMenu(0));
	pControlFile->SetCaption(_T("FILE"));
	CreateBackstage();
	CXTPRibbonTab* pTabHome = pRibbonBar->AddTab(IDS_TAB_HOME);

	CXTPRibbonGroup* pGroupFile = pTabHome->AddGroup(ID_GROUP_FILE);
	pGroupFile->Add(xtpControlButton, ID_FILE_NEW);
	pGroupFile->Add(xtpControlButton, ID_FILE_OPEN);
	pGroupFile->Add(xtpControlButton, ID_FILE_CLOSE);
	pGroupFile->Add(xtpControlButton, ID_WINDOW_NEW);
	pGroupFile->Add(xtpControlButton, ID_FILE_PRINT_PREVIEW);
	pGroupFile->Add(xtpControlButton, ID_WINDOW_ARRANGE);
	pGroupFile->Add(xtpControlButton, ID_WINDOW_TILE_HORZ);
	pGroupFile->Add(xtpControlButton, ID_WINDOW_CASCADE);

}
백스테이지 함수도 추가
void CMainFrame::CreateBackstage()
{
	CXTPRibbonBar* pRibbonBar = DYNAMIC_DOWNCAST(CXTPRibbonBar, GetCommandBars()->GetMenuBar());
	ASSERT(pRibbonBar);

	CXTPRibbonControlSystemButton* pButton = pRibbonBar->GetSystemButton();

	CXTPRibbonBackstageView* pView = CXTPRibbonBackstageView::CreateBackstageView(GetCommandBars());

	pView->AddCommand(ID_FILE_SAVE);
	pView->AddCommand(ID_FILE_OPEN);
	pView->AddCommand(ID_FILE_PRINT);
	pView->AddCommand(ID_FILE_PRINT_PREVIEW);
	pView->AddCommand(ID_FILE_PRINT_SETUP);

	pView->AddCommand(ID_APP_EXIT);

	pButton->SetCommandBar(pView);

	pView->InternalRelease();
}
이렇게 하면 기본적인 RibbonBar가 작성된다.

아이콘도 입혀본다.
void CMainFrame::Load2013Icons()
{
	CXTPCommandBars* pCommandBars = GetCommandBars();
	CXTPCommandBarsOptions* pOptions = pCommandBars->GetCommandBarsOptions();

	pCommandBars->GetImageManager()->RemoveAll();


	UINT ui32[] = { ID_EDIT_PASTE, 0, 0, 0, 0, 0, 0, 0, 0, 0
		, 0, ID_FILE_NEW, 0, 0, 0, 0, 0, 0, 0, 0 // 1
		, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 2
		, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 3
		, 0, 0, 0, 0, 0, ID_EDIT_FIND, 0, 0, 0, 0 // 4
		, 0, 0, 0, 0, 0, 0, 0, 0, 0, ID_FILE_SAVE // 5
		, 0, ID_FILE_OPEN, 0, 0, 0, 0, 0, 0, 0, 0 // 6
		, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 7
		, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 8
		, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 9
		, 0, 0, 0, ID_FILE_CLOSE, 0, 0, 0, 0, ID_WINDOW_NEW, 0 // 10
		, 0, 0, ID_FILE_PRINT_PREVIEW, 0, 0, 0, 0, ID_WINDOW_ARRANGE, ID_WINDOW_TILE_HORZ, ID_WINDOW_CASCADE // 11
		, 0, ID_FILE_PRINT, 0, 0, 0, 0, 0, 0, 0, 0 // 12
		, 0 }; // 13
	pCommandBars->GetImageManager()->SetIcons(IDR_LARGEICONS, ui32, _countof(ui32), CSize(32, 32));
}
위 코드는 Toolkit에서 제공하는 기본 오피스2013 아이콘을 이용하여 만들었으며,
배열의 각 인자에 0이 아닌 나의 리소스를 넣어주면 그 리소스안에 아이콘이 적용된다.
이미지는 아래와 같으며, 통이미지를 배열에 인덱스값을 넣어주는것 같다. (MFC 초짜라 나 혼자만의 생각이다...)


반응형
Comments