【MFC】根据菜单创建工具栏
00. 目錄
文章目錄
- 00. 目錄
- 01. 案例概述
- 02. 開發(fā)環(huán)境
- 03. 關(guān)鍵技術(shù)
- 04. 程序設(shè)計(jì)
- 05. 秘笈心法
- 06. 源碼下載
- 07. 附錄
01. 案例概述
通常工具欄能夠?qū)崿F(xiàn)的功能菜單也能實(shí)現(xiàn),菜單有命令I(lǐng)D、圖標(biāo)、名稱而工具欄也有,如果菜單項(xiàng)不是很多的話可以根據(jù)每個(gè)菜單項(xiàng)都創(chuàng)建一個(gè)工具欄按鈕,實(shí)例就是實(shí)現(xiàn)根據(jù)菜單項(xiàng)創(chuàng)建工具欄。效果如下圖所示:
02. 開發(fā)環(huán)境
系統(tǒng)環(huán)境:Windows 10
開發(fā)環(huán)境:Visual Studio 2019
03. 關(guān)鍵技術(shù)
實(shí)例的關(guān)鍵技術(shù)是如何獲取所有的菜單項(xiàng),首先使用CMenu類的LoadMenu方法加載指定ID的菜單資源。然后使用GetMenuItemCount獲取菜單項(xiàng)的個(gè)數(shù),然后使用GetSubMenu方法獲取子菜單項(xiàng),如果是級(jí)聯(lián)菜單就繼續(xù)獲取獲取子菜單下的菜單項(xiàng)個(gè)數(shù),并遍歷子菜單的菜單項(xiàng),最后通過GetMenuItemInfo獲取菜單項(xiàng)的內(nèi)容并生成工具欄按鈕。
04. 程序設(shè)計(jì)
(1)新建一個(gè)基于對(duì)話框的應(yīng)用程序。
(2)在對(duì)話框初始化函數(shù)OnInitDialog中根據(jù)菜單創(chuàng)建工具欄,代碼如下:
BOOL CMy3ToolBarDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設(shè)置此對(duì)話框的圖標(biāo)。 當(dāng)應(yīng)用程序主窗口不是對(duì)話框時(shí),框架將自動(dòng)// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)// TODO: 在此添加額外的初始化代碼//創(chuàng)建圖像列表m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 0);CString strPath;HICON hIcon;//向圖像列表中添加圖標(biāo)for (int i = 0; i < 10; i++){//獲取圖片的路徑strPath.Format(TEXT(".\\res\\ico\\%02d.ico"), i);//加載圖標(biāo)hIcon = (HICON)::LoadImage(NULL, strPath, IMAGE_ICON, 32, 32, LR_LOADFROMFILE);m_ImageList.Add(hIcon);}//創(chuàng)建工具欄m_ToolBarCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 154330);//工具欄支持自動(dòng)化m_ToolBarCtrl.EnableAutomation();//設(shè)置工具欄圖像列表m_ToolBarCtrl.SetImageList(&m_ImageList);TBBUTTON button[11];int i = 0;for (i = 0; i < 11; i++){button[i].dwData = 0;//工具欄按鈕可用button[i].fsState = TBSTATE_ENABLED;//工具欄為按鈕樣式button[i].fsStyle = TBSTYLE_BUTTON;}int iMenuButtonCount = 0;MENUITEMINFO info;CString strMenuName;CMenu menuDlgMenu;CMenu* menuDlgSubMenu;//加載資源中的菜單menuDlgMenu.LoadMenuW(IDR_MyMenu);//父菜單數(shù)量int iMenuCount = menuDlgMenu.GetMenuItemCount();for (int j = 0; j < iMenuCount; j++){//獲取子菜單menuDlgSubMenu = menuDlgMenu.GetSubMenu(j);//獲取子菜單的個(gè)數(shù)int iSubMenuCount = menuDlgSubMenu->GetMenuItemCount();for (int k = 0; k < iSubMenuCount; k++){//獲取菜單項(xiàng)的名稱menuDlgSubMenu->GetMenuStringW(k, strMenuName, MF_BYPOSITION);button[iMenuButtonCount].idCommand = menuDlgSubMenu->GetMenuItemID(k);button[iMenuButtonCount].iBitmap = iMenuButtonCount % 9;button[iMenuButtonCount].iString = m_ToolBarCtrl.AddStrings(strMenuName);iMenuButtonCount++;if (iMenuButtonCount > 10){break;}}if (iMenuButtonCount > 10){break;}}this->SetMenu(&menuDlgMenu);m_ToolBarCtrl.AddButtons(iMenuButtonCount, button);m_ToolBarCtrl.AutoSize();m_ToolBarCtrl.SetStyle(TBSTYLE_FLAT | CCS_TOP);return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE }05. 秘笈心法
工具欄按鈕的生成
實(shí)例實(shí)現(xiàn)的是將較少的菜單項(xiàng)生成為工具欄按鈕,也就是說在一行工具內(nèi)就可以全部顯示,如果菜單項(xiàng)較多的話,就需要?jiǎng)?chuàng)建多個(gè)工具欄來顯示,這時(shí)可以根據(jù)根菜單項(xiàng)的個(gè)數(shù)來決定工具欄的個(gè)數(shù)。
06. 源碼下載
下載:【MFC】根據(jù)菜單創(chuàng)建工具欄.rar
07. 附錄
總結(jié)
以上是生活随笔為你收集整理的【MFC】根据菜单创建工具栏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC】对话框中创建工具栏
- 下一篇: 【MFC】工具栏按钮的热点效果