自绘工具条

    技术2022-05-11  69

    自绘工具条                            工具条总是界面设计中首先考虑的对象。它可以完成菜单的功能,并以绚丽的图标装饰,同时能够停靠和浮动。 MFC 实现了多种工具条封装类,如 CToolBar CReBar CDialogBar CToolBarCtrl 等,它们可以实现不同特性的工具栏。如 CToolBar 可以停靠浮动, CReBar 可以伸缩, CDialogBar 可以包含子控件等。前三者都派生于 CControlBar CToolBarCtrl 派生于 CWnd 类。   制作自绘的工具条,我这里用的是 CToolBar 类。 1. 首先从 CToolBar 类派生一个类 DToolBar 。把 CMainFrame 中的“ CToolBar    m_wndToolBar; ”注释掉,添加 DToolBar m_wndToolBar; 并把 CMainFrame::OnCreate() 函数中的 //     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP //            | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) /*|| //            !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)*/) //     { //            TRACE0("Failed to create toolbar/n"); //            return -1;      // fail to create //     } 注释掉。 2. CMainFrame 中建立函数    BOOL CreateExToolBar(); BOOL CMainFrame::CreateExToolBar() {        CImageList img;        CString str;               if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))        {               return -1;             }               // 下面的代码是设置按钮的最大和最小宽度        m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50,90);        // 下面的代码是设置 " " 的位图        img.Create(25, 25, ILC_COLOR16|ILC_MASK,2,2);        img.SetBkColor(::GetSysColor(COLOR_BTNFACE));        img.Add(AfxGetApp()->LoadIcon(IDI_NEW));     img.Add(AfxGetApp()->LoadIcon(IDI_OPEN));        img.Add(AfxGetApp()->LoadIcon(IDI_SAVE));        img.Add(AfxGetApp()->LoadIcon(IDI_HOME));     img.Add(AfxGetApp()->LoadIcon(IDI_MAIL));        img.Add(AfxGetApp()->LoadIcon(IDI_FAVORITE));            m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);        img.Detach();                   // 下面的代码是设置 " " 的位图        img.Create(23, 23, ILC_COLOR16|ILC_MASK, 2,2);        img.SetBkColor(::GetSysColor(COLOR_BTNFACE));        img.Add(AfxGetApp()->LoadIcon(IDI_NEW));     img.Add(AfxGetApp()->LoadIcon(IDI_OPEN));        img.Add(AfxGetApp()->LoadIcon(IDI_SAVE));        img.Add(AfxGetApp()->LoadIcon(IDI_HOME));     img.Add(AfxGetApp()->LoadIcon(IDI_MAIL));        img.Add(AfxGetApp()->LoadIcon(IDI_FAVORITE));            m_wndToolBar.GetToolBarCtrl().SetImageList(&img);        img.Detach();               // 改变属性    m_wndToolBar.ModifyStyle(0,TBSTYLE_FLAT|TBSTYLE_TRANSPARENT); // 去掉 CBRS_CHECK, 并在 DToolBar 中重载 OnUpdateCmdUI, 就可以使没有消息映射的按钮正常显示        m_wndToolBar.SetButtons(NULL,6); // 为按钮分配空间             // set up each toolbar button 设置文字          m_wndToolBar.SetButtonInfo(0, ID_FILE_NEW, TBSTYLE_BUTTON, 0);        m_wndToolBar.SetButtonText(0, " 新建 ");            m_wndToolBar.SetButtonInfo(1, ID_FILE_OPEN, TBSTYLE_BUTTON, 1);        m_wndToolBar.SetButtonText(1, " 打开 ");          m_wndToolBar.SetButtonInfo(2, ID_FILE_SAVE, TBSTYLE_BUTTON, 2);        m_wndToolBar.SetButtonText(2, " 保存 ");          m_wndToolBar.SetButtonInfo(3, IDC_HOME, TBSTYLE_BUTTON, 3);        m_wndToolBar.SetButtonText(3, " 主页 ");                    m_wndToolBar.SetButtonInfo(4, IDC_MAIL, TBSTYLE_BUTTON, 4);        m_wndToolBar.SetButtonText(4, " 邮件 ");               m_wndToolBar.SetButtonInfo(5,IDC_FAVORITE, TBSTYLE_BUTTON, 5);        m_wndToolBar.SetButtonText(5," 收藏 ");            CRect rectToolBar;        // 得到按钮的大小        m_wndToolBar.GetItemRect(0, &rectToolBar);        // 设置按钮的大小和位图大小        m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(23,23));        return TRUE; } 3. 如果你的按钮没有添加消息相应函数,但是你仍然希望 DToolBar 中的按钮能够正常显示出图片的话,不要忘了在 DtoolBar 中添加一个虚函数     virtual void OnUpdateCmdUI(CFrameWnd* pTarget,BOOL bDisableIfNoHndler); 就可以了。 4. CmainFrame::OnCreate() 函数中添加一下代码,实现 DtoolBar 的创建。 if (!this->CreateExToolBar())               return -1; 这样一个可以根据你自己的需要添加不同的图标,可以浮动停靠的工具栏就做好了。很简单。

    最新回复(0)