在对话框中使用菜单、工具栏等
DlgBars解析
CStatic m_wndMenuBarLocation;//菜单
CStatic m_wndStatusBarLocation;//状态栏
CStatic m_wndToolbarLocation;//工具栏
CStatic m_wndOutlookBarLocation;//Outlook侧边栏
CStatic m_wndCaptionLocation;//标题栏
(2)有关菜单的类
class CMyMenuBar : public CBCGPMenuBar
class CCmdFrame : public CBCGPFrameWnd
构造函数CCmdFrame(CBCGPDialog* pDlg);
BOOL CCmdFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
ASSERT_VALID (m_pDlg);
return m_pDlg->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);//转由对话框处理
}
class CMyFrameImpl : public CBCGPFrameImpl
//CBCGPFrameImpl实现工具栏的管理,包括从注册表读写状态,docking,键盘和鼠标消息等
{
CMyFrameImpl() : CBCGPFrameImpl (NULL) {}
friend class CCmdFrame;
};
void CCmdFrame::SetMenuBar (CBCGPMenuBar* pMenuBar)
{
((CMyFrameImpl&)m_Impl).m_pMenuBar = pMenuBar;//实际是把CMyMenuBar绑定到CMyFrameImpl
}
(3)对话框类
头文件
#define CDialog CBCGPDialog
定义:
CBCGPOutlookBar m_wndOutlookBar;
CBCGPOutlookBarPane m_wndPane1;
CBCGPOutlookBarPane m_wndPane2;
CMyMenuBar m_wndMenuBar;
CBCGPCaptionBar m_wndCaptionBar;
CBCGPToolBar m_wndToolBar;
CBCGPStatusBar m_wndStatusBar;
CBitmap m_bmpCaption;
CCmdFrame* m_pMenuFrame;
Cpp文件
OnInitDialog()
// Create Outlook Bar:
DWORD dwStyle = WS_CAPTION | WS_CHILD | WS_VISIBLE | CBRS_ALIGN_LEFT;
DWORD dwBCGStyle = 0;
m_wndOutlookBar.Create (_T("Shortcuts"), this, CRect (0, 0, 100, 100),
AFX_IDW_TOOLBAR, dwStyle, dwBCGStyle);
m_wndOutlookBar.EnableGripper (TRUE);
m_wndOutlookBar.SetBarStyle (CBRS_ALIGN_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndOutlookBar.EnableSetCaptionTextToTabName (FALSE);
m_wndPane1.Create (&m_wndOutlookBar, dwDefaultToolbarStyle, 1);
m_wndPane1.SetWindowText (_T("Page 1"));
m_wndOutlookBar.AddTab (&m_wndPane1);
m_wndPane1.EnableTextLabels (TRUE);
m_wndPane1.SetOwner (this);
m_wndPane2.Create (&m_wndOutlookBar, dwDefaultToolbarStyle, 1);
m_wndPane2.SetWindowText (_T("Page 2"));
m_wndOutlookBar.AddTab (&m_wndPane2);
m_wndPane2.EnableTextLabels (TRUE);
m_wndPane2.SetOwner (this);
// Add some shortcuts:
m_wndPane1.AddButton (IDB_SHORTCUT1, "Shortcut 1", ID_SHORTCUT_1);
m_wndPane1.AddButton (IDB_SHORTCUT2, "Shortcut 2", ID_SHORTCUT_2);
m_wndPane2.AddButton (IDB_SHORTCUT3, "Shortcut 3", ID_SHORTCUT_3);
m_wndPane2.AddButton (IDB_SHORTCUT4, "Shortcut 4", ID_SHORTCUT_4);
CRect rectClient;
GetClientRect (rectClient);
// 在m_wndOutlookBarLocation所占位创建m_wndOutlookBar:
CRect rectOutlookBar;
m_wndOutlookBarLocation.GetWindowRect (&rectOutlookBar);
ScreenToClient (&rectOutlookBar);
m_wndOutlookBar.SetWindowPos (&wndTop, rectOutlookBar.left, rectOutlookBar.top,
rectOutlookBar.Width (),
rectClient.Height () - 2 * rectOutlookBar.top,
SWP_NOACTIVATE);
// Create menu bar:
m_wndMenuBar.Create (this);
CMenu menu;
menu.LoadMenu (IDR_MAINFRAME);
m_wndMenuBar.CreateFromMenu (menu.GetSafeHmenu (), TRUE, TRUE);
m_wndMenuBar.SetBarStyle (
m_wndMenuBar.GetBarStyle () &
~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
// Set menu bar position and size:
CRect rectMenuBar;
m_wndMenuBarLocation.GetWindowRect (&rectMenuBar);
ScreenToClient (&rectMenuBar);
m_wndMenuBar.SetWindowPos (&wndTop, rectMenuBar.left, rectMenuBar.top,
rectMenuBar.Width (),
rectMenuBar.Height (),
SWP_NOACTIVATE);
m_pMenuFrame = new CCmdFrame (this);
m_pMenuFrame->Create (NULL, _T(""));
m_pMenuFrame->ShowWindow (SW_HIDE);
m_pMenuFrame->SetMenuBar (&m_wndMenuBar);
m_wndMenuBar.SetOwner (m_pMenuFrame);//设定m_wndMenuBar的Owner为m_pMenuFrame
BCGCBProSetTopLevelFrame (m_pMenuFrame);
// Create caption bar:
m_wndCaptionBar.Create (WS_CHILD | WS_VISIBLE, this, (UINT)-1);
m_wndCaptionBar.SetText (_T("Caption"), CBCGPCaptionBar::ALIGN_LEFT);
m_wndCaptionBar.SetFlatBorder ();
// Load caption image:
m_bmpCaption.LoadBitmap (IDB_CAPTION);
m_wndCaptionBar.SetBitmap ((HBITMAP) m_bmpCaption.GetSafeHandle (), RGB (255, 0, 255));
m_wndCaptionBar.SetBarStyle (
m_wndCaptionBar.GetBarStyle () &
~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
// Set caption bar position and size:
CRect rectCaptionBar;
m_wndCaptionLocation.GetWindowRect (&rectCaptionBar);
ScreenToClient (&rectCaptionBar);
m_wndCaptionBar.SetWindowPos (&wndTop, rectCaptionBar.left, rectCaptionBar.top,
rectCaptionBar.Width (),
rectCaptionBar.Height (),
SWP_NOACTIVATE);
// Create toolbar:
m_wndToolBar.Create (this);
m_wndToolBar.LoadToolBar (IDR_MAINFRAME, 0, 0, TRUE );
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY);
m_wndToolBar.SetBarStyle (
m_wndToolBar.GetBarStyle () &
~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
CSize sizeToolBar = m_wndToolBar.CalcFixedLayout (FALSE, TRUE);
// Set ToolBar position and size:
CRect rectToolBar;
m_wndToolbarLocation.GetWindowRect (&rectToolBar);
ScreenToClient (&rectToolBar);
m_wndToolBar.SetWindowPos (&wndTop, rectToolBar.left, rectToolBar.top,
sizeToolBar.cx, sizeToolBar.cy, SWP_NOACTIVATE);
m_wndToolBar.SetOwner (this);
// 指示m_wndToolBar的消息全部由对话框处理
m_wndToolBar.SetRouteCommandsViaFrame (FALSE);
// Create status bar:
m_wndStatusBar.Create(this);
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT));
// Set status bar position and size:
CRect rectStatusBar;
m_wndStatusBarLocation.GetWindowRect (&rectStatusBar);
ScreenToClient (&rectStatusBar);
m_wndStatusBar.SetWindowPos (&wndTop, rectStatusBar.left, rectStatusBar.top,
rectStatusBar.Width (), rectStatusBar.Height (), SWP_NOACTIVATE);
m_wndStatusBar.SetWindowText ("Test");
//消息处理
void CDlgBarsDlg::OnEditPaste()
{
MessageBox ("OnEditPaste");
}
//状态更新
void CDlgBarsDlg::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck ();
}
LRESULT CDlgBarsDlg::OnKickIdle(WPARAM, LPARAM)
{
m_wndToolBar.OnUpdateCmdUI ((CFrameWnd*) this, TRUE);
return 0;
}