【MFC】根据菜单创建工具栏
生活随笔
收集整理的這篇文章主要介紹了
【MFC】根据菜单创建工具栏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 案例概述
- 02. 開發環境
- 03. 關鍵技術
- 04. 程序設計
- 05. 秘笈心法
- 06. 源碼下載
- 07. 附錄
01. 案例概述
通常工具欄能夠實現的功能菜單也能實現,菜單有命令ID、圖標、名稱而工具欄也有,如果菜單項不是很多的話可以根據每個菜單項都創建一個工具欄按鈕,實例就是實現根據菜單項創建工具欄。效果如下圖所示:
02. 開發環境
系統環境:Windows 10
開發環境:Visual Studio 2019
03. 關鍵技術
實例的關鍵技術是如何獲取所有的菜單項,首先使用CMenu類的LoadMenu方法加載指定ID的菜單資源。然后使用GetMenuItemCount獲取菜單項的個數,然后使用GetSubMenu方法獲取子菜單項,如果是級聯菜單就繼續獲取獲取子菜單下的菜單項個數,并遍歷子菜單的菜單項,最后通過GetMenuItemInfo獲取菜單項的內容并生成工具欄按鈕。
04. 程序設計
(1)新建一個基于對話框的應用程序。
(2)在對話框初始化函數OnInitDialog中根據菜單創建工具欄,代碼如下:
BOOL CMy3ToolBarDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。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);}}// 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標// TODO: 在此添加額外的初始化代碼//創建圖像列表m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 0, 0);CString strPath;HICON hIcon;//向圖像列表中添加圖標for (int i = 0; i < 10; i++){//獲取圖片的路徑strPath.Format(TEXT(".\\res\\ico\\%02d.ico"), i);//加載圖標hIcon = (HICON)::LoadImage(NULL, strPath, IMAGE_ICON, 32, 32, LR_LOADFROMFILE);m_ImageList.Add(hIcon);}//創建工具欄m_ToolBarCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, 154330);//工具欄支持自動化m_ToolBarCtrl.EnableAutomation();//設置工具欄圖像列表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);//父菜單數量int iMenuCount = menuDlgMenu.GetMenuItemCount();for (int j = 0; j < iMenuCount; j++){//獲取子菜單menuDlgSubMenu = menuDlgMenu.GetSubMenu(j);//獲取子菜單的個數int iSubMenuCount = menuDlgSubMenu->GetMenuItemCount();for (int k = 0; k < iSubMenuCount; k++){//獲取菜單項的名稱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; // 除非將焦點設置到控件,否則返回 TRUE }05. 秘笈心法
工具欄按鈕的生成
實例實現的是將較少的菜單項生成為工具欄按鈕,也就是說在一行工具內就可以全部顯示,如果菜單項較多的話,就需要創建多個工具欄來顯示,這時可以根據根菜單項的個數來決定工具欄的個數。
06. 源碼下載
下載:【MFC】根據菜單創建工具欄.rar
07. 附錄
總結
以上是生活随笔為你收集整理的【MFC】根据菜单创建工具栏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC】对话框中创建工具栏
- 下一篇: 【MFC】工具栏按钮的热点效果