添加菜单栏、工具栏按钮、状态栏,并将菜单栏和工具栏关联

代码部分是是网上部分是自己的,现在整理一下。以下代码都已测试过,可直接使用~

一.菜单栏:(首先新建菜单资源,假设ID号为IDR_MENU)

   1、定义类的成员变量: HMENU m_hMenu;

  2、在初始化函数中添加:m_hMenu = LoadMenu(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU));
                                      ::SetMenu(this->GetSafeHwnd(),m_hMenu);  

  3、消息响应函数:直接在Class Wizard里添加COMMAND或者COMMAD_UPDATE消息响应函数。

二. 自制工具栏:

    1、添加类的成员变量:CImageList m_imagelist;
                                     CToolBar m_toolbar;

    2、插入icon图标资源,每个按钮一个

    3、 在初始化函数里添加自定义函数inintToolbar();

       void CXcdispatchDlg::inintToolbar()
{
 /**************************创建工具栏*********************/
      m_imagelist.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);//32是图标尺寸
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_LOGOUT));//图标资源ID号
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_GEHU));
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_MESSAGE));
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_ZU));
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_ABOUT));
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_HELP));
      m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON_EXIT));
   UINT Array[7];
   for (int i=0;i<7;i++)
   {
    Array[i]=9000+i;
   }
   m_toolbar.Create(this);
   m_toolbar.SetButtons(Array,7);
   m_toolbar.SetButtonText(0,"注销");
   m_toolbar.SetButtonText(1,"个呼");
   m_toolbar.SetButtonText(2,"短信");
   m_toolbar.SetButtonText(3,"转组");
   m_toolbar.SetButtonText(4,"关于");
   m_toolbar.SetButtonText(5,"帮助");
   m_toolbar.SetButtonText(6,"退出");
   m_toolbar.GetToolBarCtrl().SetButtonWidth(20,20);
   m_toolbar.GetToolBarCtrl().SetImageList(&m_imagelist);
   m_toolbar.SetSizes(CSize(50,50),CSize(30,30));   //尺寸大小  可以调  
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}

三 在菜单栏关联工具栏,设置菜单栏前如果打勾则工具栏显示,否则工具栏不显示

1、添加自定义消息响应函数OnInitMenuPopup:

      在头文件中添加afx_msg void OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu);

      在cpp文件中添加ON_WM_INITMENUPOPUP()

      然后添加具体代码

void CXcdispatchDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
{
   CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    if(!bSysMenu && pPopupMenu)
    {
        CCmdUI cmdUI;
        cmdUI.m_pOther = NULL;
        cmdUI.m_pMenu = pPopupMenu;
        cmdUI.m_pSubMenu = NULL;

        UINT count = pPopupMenu->GetMenuItemCount();
        cmdUI.m_nIndexMax = count;
        for(UINT i=0; i         {
            UINT nID = pPopupMenu->GetMenuItemID(i);
            if(-1 == nID || 0 == nID)
            {
                continue;
            }
            cmdUI.m_nID = nID;
            cmdUI.m_nIndex = i;
            cmdUI.DoUpdate(this, FALSE);
        }
    }
}


2、 添加消息响应函数OnBnClickedToolBar(UINT nID):

     在cpp文件中添加ON_COMMAND_RANGE(9000,9006, OnBnClickedToolBar) //因为我是7个按钮判断按了哪个

     void CXcdispatchDlg::OnBnClickedToolBar(UINT nID)
{
  int nIndex=nID-9000;
  switch(nIndex)
  {
  case 0:{
            LogoutButton();
   }
   break;
  case 1:{
            GeHu dlg;
     dlg.DoModal();
   }
   break;
  case 2:{
            ShortMessage dlg;
      dlg.DoModal();
   }
   break;
  case 3:{
            Zhuanzu dlg;
      dlg.DoModal();
   }
   break;
  case 4:{
            AfxMessageBox("关于");
   }
   break;
  case 5:{
            AfxMessageBox("帮助");
   }
   break;
  case 6:{
            ExitButton();
   }
   break;
  default:
         AfxMessageBox("出错啦");
   break;
  }

}

!!!注意:添加了上面那句ON_COMMAND_RANGE(9000,9006,OnBnClickedToolBar)这个范围后,发现不能用Class Wizard添加控件的消息响应函数了,而且添加一次工程里所有的afx_msg消息响应函数会自动成倍增加,这个原因我现在还不太清楚为什么,网上看到也有人有过这个问题,但是没看到有人跟帖,如果有知道的希望分享一下啦。所以我现在先把这句删了,等最后再添加。没有这句就不能判断按了哪个工具栏按钮,执行上面这个函数里不同的case内容了。


3、接下来就是菜单栏前面打勾,工具栏按钮显示;不打勾工具栏隐藏

     以帮助菜单为例,添加类的成员变量: BOOL flag;

     然后在Class Wizard添加该菜单的COMMAND和COMMAND_UPDATE消息响应函数。

    void CXcdispatchDlg::OnHelp()
{
 flag=!flag;
 if(flag==true)
     m_toolbar.GetToolBarCtrl().HideButton(9005,FALSE);//我有7个工具栏按钮需要和菜单栏关联,设了9000-9006,其中这个帮助菜单是第6个,所以是9005
    else
     m_toolbar.GetToolBarCtrl().HideButton(9005,TRUE);
}

void CXcdispatchDlg::OnUpdateHelp(CCmdUI* pCmdUI)
{
     pCmdUI->SetCheck(flag); //SetCheck是显示菜单前是否打钩
}


四 状态栏

    添加类的成员变量:CStatusBarCtrl m_StatusBar;

   在初始化函数中添加:

    m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW, CRect(0,0,0,0), this, 0); int strPartDim[4]= {120, 240,360, -1}; //分割数量, 我一共是4项内容,前三个递增
    m_StatusBar.SetParts(4, strPartDim);
    m_StatusBar.SetText("CAD服务器:", 0, 0);
    m_StatusBar.SetText("集中网管:", 1, 0);
    m_StatusBar.SetText("ATS系统:", 2, 0);
    m_StatusBar.SetText("时钟系统:", 3, 0);


  到这里就差不多啦,欢迎有更好的补充~



你可能感兴趣的:(添加菜单栏、工具栏按钮、状态栏,并将菜单栏和工具栏关联)