代码部分是是网上部分是自己的,现在整理一下。以下代码都已测试过,可直接使用~
一.菜单栏:(首先新建菜单资源,假设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);
到这里就差不多啦,欢迎有更好的补充~