• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            [zz]MFC中菜單的應用(注釋詳細)

              1 取消右鍵系統菜單

            PreCreateWindow函數中改變設置樣式:

            cs.style&=~WS_SYSMENU

            CREATESTRUCT的具體結構如下:

             

            typedef struct tagCREATESTRUCT {
               LPVOID    lpCreateParams;
               HANDLE    hInstance;
            //當前實例句柄
               HMENU     hMenu;//菜單句柄
               HWND      hwndParent;//父窗口
               int       cy;//寬度
               int       cx;//高度
               int       y;//窗口位置坐標
               int       x;//窗口位置坐標
               LONG      style;//窗口樣式
               LPCSTR    lpszName;//標題
               LPCSTR    lpszClass;//窗口類名
               DWORD     dwExStyle;//窗口擴展樣式
            }
             CREATESTRUCT;

             

             

            2.在右鍵系統菜單加入菜單項:

            在窗口創建的時候加入

                CMenu *pMenu=GetSystemMenu(FALSE);//取得系統菜單
                CString StrMenuTitle="我的菜單";
                pMenu
            ->AppendMenu(MF_SEPARATOR);//增加一個項目到菜單的末尾,增加分割線
                pMenu->AppendMenu(MF_STRING,IDM_MYSYSTEM,StrMenuTitle);

            MSDN中的定義;

            BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
            BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, 
            const CBitmap* pBmp );

            NFlags:標志位,可以是, MF_OWNERDRAW, MF_STRING, MF_SEPARATOR, MF_POPUP

            NIDNewItem:菜單項目的ID,如果Nflags設置為MF_POPUP,那么就是子菜單的句柄,如果是MF_SEPARATOR,就突列.

            LpszNewItem:新菜單項的內容

            PBmp:菜單項圖像對象,指向一個Cbitmap對象

            在系統菜單中增加了菜單項之后再增加消息處理函數.發送的是系統消息,OnSysCommand函數中處理

            void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
            {
            if(nID==IDM_MYSYSTEM)
            {
                 MessageBox(
            "這是我的自定義系統菜單","信息提示",MB_OK);
            }

            CFrameWnd::OnSysCommand(nID, lParam);
            }

            3.動態的增加菜單項:

             

            pMenu->GetSubMenu(0)->AppendMenu(MF_SEPARATOR);//增加分割線
            pMenu->GetSubMenu(0)->AppendMenu(MF_STRING,ID_APP_ABOUT,"關于");//增加菜單項

            4.動態的刪除菜單項:

                CMenu *pMenu=AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
                
            for(int i=0;i<pMenu->GetMenuItemCount();i++)
                
            {
                    CString StrName;
                    pMenu
            ->GetMenuString(i,StrName,MF_BYPOSITION);
                    
            if(StrName.Find("保存",0)==0)
                    
            {
                        pMenu
            ->DeleteMenu(i,MF_BYPOSITION);
                        MessageBox(
            "刪除“文件/保存”菜單操作成功!請查看","信息提示",MB_OK);
                        
            break;
                    }

                }

            函數說明:

                int GetMenuString( UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags ) const;

            int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;

            nIDItem:由標志位確定,可以是菜單項的ID或者偏移量

            lpStringrString:存放字符

            nMaxCount:最大長度

            nFlags;標志位,可以是MF_BYCOMMANDMF_BYPOSITION

            BOOL DeleteMenu( UINT nPosition, UINT nFlags );//刪除一個菜單項

            BOOL RemoveMenu( UINT nPosition, UINT nFlags );

            5.如何觸發系統菜單命令;

            AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND,SC_CLOSE);

            6.如何創建一個彈出式菜單

                以右擊鼠標鍵為例:

                CMenu Menu;

                //創建一個彈出式菜單

                Menu.CreatePopupMenu();

                //添加一個菜單項

                Menu.AppendMenu(0, ID_POPUP_MENU1, "菜單項&");

                //添加一個左邊帶復選標志的菜單項

                Menu.AppendMenu(MF_CHECKED, ID_POPUP_MENU2, "菜單項&");

                //添加一個分隔條

                Menu.AppendMenu(MF_SEPARATOR, 0, "");

                //顯示一個灰色和無效的菜單項

                Menu.AppendMenu(MF_GRAYED, ID_POPUP_MENU3, "菜單項&");

                //添加一個左邊帶單選標志的菜單項

                Menu.AppendMenu(0, ID_POPUP_MENU4, "菜單項&");

                Menu.CheckMenuRadioItem(ID_POPUP_MENU3,ID_POPUP_MENU4,ID_POPUP_MENU4,MF_BYCOMMAND);

                //使菜單項為缺省菜單項,以黑體字顯示,并在用戶按回車時響應

                ::SetMenuDefaultItem(Menu.m_hMenu,ID_POPUP_MENU4,MF_BYCOMMAND);

                //根據當前光標位置顯示菜單

                CPoint Pos;

                GetCursorPos(&Pos); //取得光標位置

                Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Pos.x, Pos.y, this);//彈出菜單

                Menu.DestroyMenu();

                CView::OnRButtonDown(nFlags, point);

            函數說明:

            BOOL CreatePopupMenu( );//創建一個彈出式菜單

            BOOL CheckMenuRadioItem( UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );

                NIDFirst:單選按鈕組的第一個項的ID或命令

                NIDLast:單選按鈕組的最或一個項的ID或命令

            NIDItem:單選標記的按鈕

            NFlags;標志位,MF_BYCOMMANDMF_BYPOSITION

            BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );//在指定的位置彈出菜單

            NFlagsTPM_CENTERALIGNTPM_LEFTALIGN TPM_RIGHTALIGNTPM_LEFTBUTTON TPM_RIGHTBUTTON

            PWnd:從菜單中接收WM_COMMAND消息

            LpRect:包含屏幕的矩形位置,如果用戶單擊,就取消彈出菜單的顯示,為NULL時,如果用戶單擊彈出菜單的其他部分,就取消顯示

            7.創建快捷菜單:

            重載窗口的OnContextMenu函數,當鼠標右鍵單擊時觸發它,

            void C。。。。View::OnContextMenu(CWnd* pWnd, CPoint point)

            {

                CMenu Menu;

                if(Menu.LoadMenu(IDR_MAINFRAME))

                {

                    CMenu *pMenu=Menu.GetSubMenu(0);

                    pMenu->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd());

                }

            }

            8.取消應用程序的菜單;

                CMenu *pMenu=GetMenu();

                pMenu->DestroyMenu();

                SetMenu(NULL);

            9.如何在菜單中添加位圖

                在應用程序的視圖類中添加CBitmap類的對象,取名為bm_open1bm_open2。在視圖類的構造函數中添加以下代碼:

            bm_open1.LoadBitmap(IDB_OPEN1)

            bm_open2.LoadBitmap(IDB_OPEN2)

            添加位圖到菜單

            CWnd*parent=GetParent()

            CMenu*pmenubar=parent->GetMenu()

            CMenu*pmenu=pmenubar->GetSubMenu(2)

            pmenu->SetMenuItemBitmaps(1MF_BYPOSITION&bm_open1&bm_open2)

            函數說明:

            BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );

            相信看到函數原形就可以知道函數是什么意思

            posted on 2009-10-23 16:32 小默 閱讀(1847) 評論(0)  編輯 收藏 引用 所屬分類: Language

            導航

            統計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            97精品国产97久久久久久免费| 2020久久精品国产免费| 国产人久久人人人人爽| 日产精品久久久久久久| 久久亚洲AV无码西西人体| 久久高潮一级毛片免费| 国产精品免费久久久久久久久 | 久久精品国产99国产精品亚洲| 久久亚洲欧洲国产综合| 久久精品国产亚洲AV不卡| 91超碰碰碰碰久久久久久综合| 精品国产91久久久久久久| 国产精品美女久久久m| 精品久久久久久无码专区| 国产三级久久久精品麻豆三级 | 婷婷五月深深久久精品| 亚洲精品乱码久久久久久| 国产成年无码久久久久毛片| 久久中文字幕一区二区| 国产精品热久久无码av| 日本国产精品久久| 久久国语露脸国产精品电影| 精品久久久久中文字幕日本| 成人国内精品久久久久影院VR| 久久精品成人一区二区三区| 四虎国产精品成人免费久久 | 久久综合给合久久国产免费| 国产精品久久久久天天影视| 国产99久久久国产精品~~牛| 精品久久久久久久国产潘金莲| 久久丫精品国产亚洲av| 久久久久国产一级毛片高清版| 亚洲国产精品无码久久九九| 国内精品久久人妻互换| 久久久久亚洲?V成人无码| 一本色道久久综合狠狠躁| 一本色道久久88加勒比—综合| 久久无码专区国产精品发布| 久久久久久久综合日本亚洲| 亚洲AV日韩精品久久久久久久| 狠狠人妻久久久久久综合蜜桃|