BCGControlBar使用(四)

本文介绍如何在MFC对话框中集成菜单、工具栏、状态栏等组件,并详细讲解了具体的实现步骤,包括创建和布局这些组件的方法。

在对话框中使用菜单、工具栏等

DlgBars解析

【原创】BCGControlBar使用(四)

(1)在对话框资源中进行占位,设置相应ID,产生相应变量

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值