用的一个开源的类,叫XP Style Explorer Bar,可惜他给的例子是MDI的,我怎么在Dialog项目中使用?
下面的m_wndExpBar在.h中定义为CExpBarXP m_wndExpBar;CExpBarXP最终继承CControlBar
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// create a view to occupy the client area of the frame
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -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))
{
TRACE0("Symbolleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Statusleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
} m_bPaneVisible[0] = m_bPaneVisible[1] = m_bPaneVisible[2] = FALSE;
m_uProgress = 0L; if (!m_wndExpBar.Create(_T("Explorer Bar"), this, 124, CBRS_LEFT|CBRS_SIZE_DYNAMIC))
// if (!m_wndExpBar.Create(_T("Explorer Bar"), this, 123, CBRS_RIGHT|CBRS_SIZE_DYNAMIC))
{
TRACE0("Failed to create explorer bar\n");
return -1; // fail to create
} m_wndExpBar.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT); m_hBigIcon = CreateImageList(AfxGetApp()->m_hInstance,IDB_FOLDER,
48,RGB(0xFF,0x00,0xFF),&m_uNumIcons,NULL,NULL,NULL); m_hTaskLinkIcons[1] = CreateImageList(AfxGetApp()->m_hInstance,IDB_IMAGELIST,
16,RGB(123,124,125),&m_uNumIcons,NULL,&m_hTaskLinkIcons[2],
&m_hTaskLinkIcons[0]);
EnableDocking(CBRS_ALIGN_ANY);#ifdef _SCB_REPLACE_MINIFRAME
m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
#endif DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndExpBar); return 0;
}
下面的m_wndExpBar在.h中定义为CExpBarXP m_wndExpBar;CExpBarXP最终继承CControlBar
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// create a view to occupy the client area of the frame
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -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))
{
TRACE0("Symbolleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Statusleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
} m_bPaneVisible[0] = m_bPaneVisible[1] = m_bPaneVisible[2] = FALSE;
m_uProgress = 0L; if (!m_wndExpBar.Create(_T("Explorer Bar"), this, 124, CBRS_LEFT|CBRS_SIZE_DYNAMIC))
// if (!m_wndExpBar.Create(_T("Explorer Bar"), this, 123, CBRS_RIGHT|CBRS_SIZE_DYNAMIC))
{
TRACE0("Failed to create explorer bar\n");
return -1; // fail to create
} m_wndExpBar.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT); m_hBigIcon = CreateImageList(AfxGetApp()->m_hInstance,IDB_FOLDER,
48,RGB(0xFF,0x00,0xFF),&m_uNumIcons,NULL,NULL,NULL); m_hTaskLinkIcons[1] = CreateImageList(AfxGetApp()->m_hInstance,IDB_IMAGELIST,
16,RGB(123,124,125),&m_uNumIcons,NULL,&m_hTaskLinkIcons[2],
&m_hTaskLinkIcons[0]);
EnableDocking(CBRS_ALIGN_ANY);#ifdef _SCB_REPLACE_MINIFRAME
m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
#endif DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndExpBar); return 0;
}
最好把控制条“嵌入”原先的对话框窗口中,而不是另开一个窗口
或者谁干脆把这份源码改成dialog的。。
我目前采用了你的建议,现在有个问题是这个controlbar的标题栏和边框如何去掉?