荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店