• <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_CENTERALIGN,TPM_LEFTALIGN ,TPM_RIGHTALIGN,TPM_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 小默 閱讀(1857) 評論(0)  編輯 收藏 引用 所屬分類: Language

            導航

            統計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久久久免费视频| 国产精品一久久香蕉国产线看观看| 欧美亚洲国产精品久久蜜芽| 久久久久久综合一区中文字幕| 亚洲国产精品久久久久久| 久久久噜噜噜久久中文字幕色伊伊| 伊人久久大香线蕉成人| 久久影院综合精品| 青青热久久国产久精品| 丰满少妇高潮惨叫久久久| 久久国产精品免费一区二区三区| 国产精品久久久久久久久软件 | 国产一区二区久久久| 国产精品毛片久久久久久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 一本大道久久a久久精品综合| 性做久久久久久久久浪潮| 久久99精品久久久久婷婷| 国产精品狼人久久久久影院 | 久久伊人色| 99久久精品国产一区二区三区| 亚洲国产欧洲综合997久久| 久久精品无码专区免费| 亚洲国产精品久久久久网站 | 久久一本综合| 久久夜色精品国产亚洲| 国产亚洲精久久久久久无码| 五月丁香综合激情六月久久| 亚洲伊人久久成综合人影院 | 99久久99久久| 久久国产精品77777| 日本五月天婷久久网站| 女人高潮久久久叫人喷水| 久久亚洲精品无码播放| 精品久久久久久无码中文字幕| 久久99国产亚洲高清观看首页| 久久精品人人做人人爽97| 久久久久无码精品国产| 久久精品www人人爽人人| 99久久婷婷国产综合亚洲| 久久99精品久久久久久久不卡|