荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: scanf (carefully), 信区: Visual
标 题: [新手入门]VC入门每日一例!(二)
发信站: 荔园晨风BBS站 (Sun Nov 2 10:50:36 2003), 站内信件
带图标的菜单
在菜单项的旁边加上一个图标可以是该菜单项的意义更明确,而且能体现专业水准
,如visual studio的菜单,本例介绍如何实现带图标的菜单。
实现方法:
本例提供一个功能比较完善的菜单类BCMenu,通过该类可以实现图表菜单的效果。先
生成一个ModifyODMenuA 函数修改某个菜单项的图标,最后将起设置为CMainFrame
菜单。
程序代码:
一、建立一个单文档的应用程序BmpMenu。
二、将BCMenu.cpp和BCMenu.h加到工程中。
三、在CMainFrame的头文件中的定义一个BMenu的对象(别忘记了包含BCMenu。h);
BCMenu m_menu;
四、在CMainFrame中假如一个生成图标菜单的函数NewMenu的对象,其定义如下:
HMENU CMainFrame::NewMenu()
{
m_menu.LoadMenu(IDR_MAINFRAME);
//将图标加到菜单中
m_menu.ModifyODMenuA(NULL,ID_FILE_NEW,IDB_FILE_NEW);
m_menu.ModifyODMenuA(NULL,ID_FILE_OPEN,IDB_FILE_OPEN);
m_menu.ModifyODMenuA(NULL,ID_FILE_SAVE,IDB_FILE_SAVE);
m_menu.ModifyODMenuA(NULL,ID_FILE_PRINT,IDB_FILE_PRINT);
//返回图标菜单的句柄
return m_menu.Detach();
}
五、在CBmpMenuApp的InitInstance函数最后加入如下代码,设图标菜单为主窗口
的菜单:
if (!ProcessShellCommand(cmdInfo))
return FALSE;
//将默认的菜单清除
CMenu* pMenu = m_pMainWnd->GetMenu();
if (pMenu)pMenu->DestroyMenu();
//设置菜单为新的图标菜单
HMENU hMenu = ((CMainFrame*) m_pMainWnd)->NewMenu();
pMenu = CMenu::FromHandle( hMenu );
m_pMainWnd->SetMenu(pMenu);
((CMainFrame*)m_pMainWnd)->m_hMenuDefault = hMenu;
// The one and only window has been initialized, so show and update
it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
在CMainFrame中加入WM_MEASUREITEM,WM_MENUCHAR和WM_INITMENUPOPUP三个消息的响应
函数,起代码如下:
void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT
lpMeasureItemStruct)
{
// TODO: Add your message handler code here and/or call default
BOOL setflag=FALSE;
if(lpMeasureItemStruct->CtlType==ODT_MENU){
if(IsMenu((HMENU)lpMeasureItemStruct->itemID)){
CMenu* cmenu =
CMenu::FromHandle((HMENU)lpMeasureItemStruct->
itemID);
if(m_menu.IsMenu(cmenu)){
m_menu.MeasureItem(lpMeasureItemStruct);
setflag=TRUE;
}
}
}
if(!setflag)CFrameWnd::OnMeasureItem(nIDCtl,
lpMeasureItemStruct);
// CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
LRESULT CMainFrame::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu)
{
// TODO: Add your message handler code here and/or call default
LRESULT lresult;
if(m_menu.IsMenu(pMenu))
lresult=BCMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
else
lresult=CFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
return(lresult);
// return CFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
}
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL
bSysMenu)
{
CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if(!bSysMenu){
if(m_menu.IsMenu(pPopupMenu))
BCMenu::UpdateMenu(pPopupMenu);
}
好了,看看是不是实现你想要的
--
→我:(打劫内裤,快脱,不然,老子毙了你!)
看 ● ○ ╮╮ 看
↓ █┳ ┗█┛ \█/ 我倒!~~↓
面 ┏┓ ┛┗ ● 面
→你:(大哥,我今天没穿啊,不要~不要啊!)
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.110]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店