• <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_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 小默 閱讀(1847) 評論(0)  編輯 收藏 引用 所屬分類: Language

            導航

            統計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            欧美无乱码久久久免费午夜一区二区三区中文字幕 | 99久久国产综合精品五月天喷水 | 久久天堂AV综合合色蜜桃网| 色88久久久久高潮综合影院 | 久久99国产综合精品女同| 91精品国产91热久久久久福利| 国内精品久久久久国产盗摄| 久久午夜福利无码1000合集| 久久婷婷五月综合色高清| 久久久久无码精品| 国产精品久久久久久吹潮| 理论片午午伦夜理片久久| 丁香狠狠色婷婷久久综合| 久久久久久久97| 久久99国产亚洲高清观看首页 | 一本色道久久HEZYO无码| 激情久久久久久久久久| 漂亮人妻被黑人久久精品| 精品久久久久中文字幕一区| 91精品国产乱码久久久久久 | 日产精品久久久一区二区| 国产精品九九久久免费视频 | 精品综合久久久久久97超人 | 久久久久人妻一区精品果冻| 91精品国产综合久久婷婷| 国内精品伊人久久久久777| 久久久99精品一区二区| 99久久精品国内| 久久国产精品99精品国产| 一本色道久久88精品综合| 性做久久久久久久久老女人| 久久久久99精品成人片三人毛片 | 久久精品国产亚洲av水果派| yy6080久久| 久久久久久久精品妇女99| 欧美国产成人久久精品| 狠狠色噜噜色狠狠狠综合久久| 囯产精品久久久久久久久蜜桃| 综合人妻久久一区二区精品| 久久精品国产精品亚洲精品| 18岁日韩内射颜射午夜久久成人|