• 工具栏,状态栏(VC_MFC)


    目录

    工具栏
    状态栏

    (本章节中例子都是用 VS2005 编译调试的)


    工具栏

    [对话框][单/多文档]

    相关类:     CToolBar   ,  CToolBarCtrl

     

    对话框

    相关函数:

    操作步骤:

    菜单索引:

    代码示例:

    [加载工具栏][加载自定义位图的工具栏]

    加载工具栏

    在对话框中添加工具栏,首先添加一个工具栏资源(资源 ID 为 IDR_TOOLBAR1),工具栏资源和对话框资源,资源视图如下:

    然后为对话框添加一个 CToolBar 对象变量名为 m_tbar,然后在对话框初始化函数(即 OnInitDialog 函数)中添加实现代码,代码如下:

    View Code
    //创建 ToolBar 和加载资源
    if(m_tbar.Create(this) && m_tbar.LoadToolBar(IDR_TOOLBAR1))
    {
        /* 前期准备工作 *************************************************************************/
        CRect rcClientOld;
        CRect rcClientNew;
        // 用 rcClientOld 获取客户区间
        GetClientRect(rcClientOld); 
        // 用 rcClientNew 获得除了 ToolBar 区的对话框客户区
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);
        //获得在加入 ToolBar 后控件应该移动的偏移偏移量
        CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top);
    
        /* 重新设置对话框的窗体区间 *************************************************************/
        //得到对话框窗体区间 
        CRect rcWindow;
        GetWindowRect(rcWindow);
        //修改对话框宽度和高度,即让对话框添加上 ToolBar 的高度和适应 ToolBar 的高度
        rcWindow.right += rcClientOld.Width() - rcClientNew.Width();   
        rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
        //移动对话框
        MoveWindow(rcWindow,FALSE);   
    
        /* 调整控件位置 *************************************************************************/
        CRect rcChild;
        //获得窗口控件    
        CWnd* pwndChild = GetWindow(GW_CHILD); 
        //遍历控件
        while(pwndChild) 
        {
            //获得控件区间
            pwndChild->GetWindowRect(rcChild);
            //将屏幕坐标转换为客户区坐标
            ScreenToClient(rcChild);
            //将控件移动相对位置
            rcChild.OffsetRect(ptOffset);
            //移动控件
            pwndChild->MoveWindow(rcChild,FALSE);
            //获得下个控件句柄
            pwndChild = pwndChild->GetNextWindow();
        }
        //显示 ToolBar
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
    }

    运行结果:

    加载自定义位图的工具栏

    在对话框中添加工具栏,首先添加一个位图资源(资源 ID 为 IDB_BITMAP1),位图资源和对话框资源,资源视图如下:

    然后为对话框添加一个 CToolBar 对象变量名为 m_tbar,然后在对话框初始化函数(即 OnInitDialog 函数)中添加实现代码,(具体代码和添加工具栏中的相似)代码如下:

    View Code
    //创建工具栏
    if(m_tbar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_SIZE_FIXED|CBRS_TOP|CBRS_TOOLTIPS))
    {
        /* 创建自定义位图的工具栏初始化工作 ***************************************************/
        //定义工具栏上的按钮的所对应的标识
        static UINT BASED_CODE DockTool[]={IDOK,IDCANCEL};
    
        //加载工具栏要用的位图
        CBitmap bitmap;
        bitmap.LoadBitmapW(IDB_BITMAP1);
        //建立工具栏中的图片列表
        static CImageList m_ilToolBar;
        m_ilToolBar.Create(100,100,ILC_COLOR32,0,0);//以宽 100,长 100 像素来切割图片
        m_ilToolBar.Add(&bitmap,(CBitmap*)NULL);
        //设置工具栏按钮图片
        m_tbar.GetToolBarCtrl().SetImageList(&m_ilToolBar);
    
        //设置工具栏的按钮大小,和按钮中位图大小(注意: 按钮大小必须大于按钮中位图大小)
        SIZE sbutton,sImage;
        sbutton.cx= 110;
        sbutton.cy=110;
        sImage.cx=100;
        sImage.cy=100;
        m_tbar.SetSizes(sbutton,sImage);
        //设置工具栏上按钮的所对应的标识,和按钮个数
        m_tbar.SetButtons(DockTool,(UINT)2);
    
        /* 前期准备工作 *************************************************************************/
        CRect rcClientOld;
        CRect rcClientNew;
        // 用 rcClientOld 获取客户区间
        GetClientRect(rcClientOld); 
        // 用 rcClientNew 获得除了 ToolBar 区的对话框客户区
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);
        //获得在加入 ToolBar 后控件应该移动的偏移偏移量
        CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top);
    
        /* 重新设置对话框的窗体区间 *************************************************************/
        //得到对话框窗体区间 
        CRect rcWindow;
        GetWindowRect(rcWindow);
        //修改对话框宽度和高度,即让对话框添加上 ToolBar 的高度和适应 ToolBar 的高度
        rcWindow.right += rcClientOld.Width() - rcClientNew.Width();   
        rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
        //移动对话框
        MoveWindow(rcWindow,FALSE);   
    
        /* 调整控件位置 *************************************************************************/
        CRect rcChild;
        //获得窗口控件    
        CWnd* pwndChild = GetWindow(GW_CHILD); 
        //遍历控件
        while(pwndChild) 
        {
            //获得控件区间
            pwndChild->GetWindowRect(rcChild);
            //将屏幕坐标转换为客户区坐标
            ScreenToClient(rcChild);
            //将控件移动相对位置
            rcChild.OffsetRect(ptOffset);
            //移动控件
            pwndChild->MoveWindow(rcChild,FALSE);
            //获得下个控件句柄
            pwndChild = pwndChild->GetNextWindow();
        }
        //显示 ToolBar
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
    }

    运行结果:

    单/多文档

    相关函数:

    操作步骤:

    菜单索引:

    代码示例:

    [加载工具栏][加载带自定义位图工具栏][显示/隐藏工具栏]

    加载工具栏

    在文档中添加工具栏,这个功能只能在框架类中完成(即 CFrameWnd 类),由于一生成 单文档/多文档 工程时候,会为程序添加一个默认的工具栏(资源 ID 为).这里用的是单文档工程这个工具栏的资源视图如下:

    这个工具栏的添加在框架类的初始化(即 OnCreate 函数)中,具体代码如下(省略了无关代码):

    View Code
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
        
        //创建一个工具栏
        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("未能创建工具栏\n");
            return -1;      // 未能创建
        }
    
        ...
    
        //使工具栏可以停靠
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_wndToolBar);
    
        ...
    }

    运行结果:

    加载自定义位图的工具栏

    在文档中添加工具栏,这个功能只能在框架类中完成(即 CFrameWnd 类),这里生成的是单文档工程,然后为文档添加一个位图资源,资源视图如下:

    然后为框架类添加一个 CToolBar 对象变量名为 m_Mytbar,在框架类的初始化(即 OnCreate 函数)中,添加相关的实现代码,具体代码如下:

    View Code
    //创建自定义工具栏
    if (m_Mytbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
    {
        //定义工具栏上的按钮的所对应的标识
        static UINT BASED_CODE DockTool[]={ID_FILE_NEW,ID_FILE_OPEN};
    
        //加载工具栏要用的位图
        CBitmap bitmap;
        bitmap.LoadBitmapW(IDB_BITMAP1);
        //建立工具栏中的图片列表
        static CImageList ilToolBar;
        ilToolBar.Create(100,100,ILC_COLOR32,0,0);//以宽 100,长 100 像素来切割图片
        ilToolBar.Add(&bitmap,(CBitmap*)NULL);
        //设置工具栏按钮图片
        m_Mytbar.GetToolBarCtrl().SetImageList(&ilToolBar);
    
        //设置工具栏的按钮大小,和按钮中位图大小(注意: 按钮大小必须大于按钮中位图大小)
        SIZE sbutton,sImage;
        sbutton.cx= 110;
        sbutton.cy=110;
        sImage.cx=100;
        sImage.cy=100;
        m_Mytbar.SetSizes(sbutton,sImage);
        //设置工具栏上按钮的所对应的标识,和按钮个数
        m_Mytbar.SetButtons(DockTool,(UINT)2);
    
        //设置工具栏使其可以停靠在框架窗口上
        m_Mytbar.EnableDocking(CBRS_ALIGN_ANY);
        //把工具栏停靠在框架窗口上
        DockControlBar(&m_Mytbar);
    }

    运行结果:

    工具栏的显示与隐藏

    接着上个代码示例,为文档程序在主菜单栏上添加个 显示/隐藏工具栏 的菜单项,完成 显示/隐藏工具栏 的这个功能.菜单资源(菜单资源 ID 为 IDR_MAINFRAME,菜单项 ID 为 ID_TB)视图如下:

    为菜单项 显示/隐藏工具栏 在框架类中添加事件响应函数,后在事件响应函数中添加相关操作,具体代码如下:

    if(m_Mytbar.IsWindowVisible())
        ShowControlBar(&m_Mytbar,false,false);
    else
        ShowControlBar(&m_Mytbar,true,false);

    运行结果:


    状态栏

    [对话框][单/多文档]

    相关类:   CStatusBar  ,  CStatusBarCtrl

    对话框

    相关函数:

    具体步骤:

    代码示例:

    在对话框中添加状态栏,首先添加两个图标资源(资源 ID 为 IDI_ICON1,IDI_ICON2),图标资源和对话框资源,资源视图如下:

    然后为对话框添加一个 CStatusBar 对象变量名为 m_StatBar,然后在对话框初始化函数(即 OnInitDialog 函数)中添加实现代码,具体代码如下:

    View Code
    //创建状态栏
    if(m_StatBar.Create(this))
    {
        // 状态行指示器对应 ID
        static UINT indicators[] =
        {
            ID_SEPARATOR,           
            ID_INDICATOR_CAPS,
            ID_INDICATOR_NUM,
            ID_INDICATOR_SCRL,
        };
    
        // 设置状态栏指示器 ID 和指示器个数
        m_StatBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
        
        // 设置状态栏指示器文本
        m_StatBar.SetPaneText(0,L"指示器1",0);
        m_StatBar.SetPaneText(1,L"指示器2",0);
        m_StatBar.SetPaneText(2,L"指示器3",0);
        m_StatBar.SetPaneText(3,L"指示器4",0);
        
        // 设置状态栏指示器属性
        m_StatBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NORMAL   ,100);
        m_StatBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL   ,100);
        m_StatBar.SetPaneInfo(2,ID_INDICATOR_NUM,SBPS_NORMAL   ,100);
        m_StatBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL   ,100);
    
        //为状态栏指示器添加图标
        HICON icon[2];
        icon[0] = AfxGetApp()->LoadIcon (IDI_ICON1);
        icon[1] = AfxGetApp()->LoadIcon (IDI_ICON2);
        m_StatBar.GetStatusBarCtrl().SetIcon(0,icon[0]);
        m_StatBar.GetStatusBarCtrl().SetIcon(1,icon[1]);
        m_StatBar.GetStatusBarCtrl().SetIcon(2,icon[0]);
        m_StatBar.GetStatusBarCtrl().SetIcon(3,icon[1]);
        //设置状态栏高度
        m_StatBar.GetStatusBarCtrl().SetMinHeight(50);
        
        /* 前期准备工作 *************************************************************************/
        CRect rcClientOld;
        CRect rcClientNew;
        // 用 rcClientOld 获取客户区间
        GetClientRect(rcClientOld); 
        // 用 rcClientNew 获得除了 CStatusBar 区的对话框客户区
        
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);
        /* 这里要注意下如果你在对话框中添加了工具栏和状态栏,那么这里获得的是这些控制栏的矩形区,即高度是控制栏(工具栏加状态栏)的总和,宽度是控制栏中最宽的那个..********/
    
        /* 重新设置对话框的窗体区间 *************************************************************/
        // 得到对话框窗体区间 
        CRect rcWindow;
        GetWindowRect(rcWindow);
        // 修改对话框宽度和高度,即让对话框添加上 CStatusBar 的高度和适应 CStatusBar 的宽度
        rcWindow.right += rcClientOld.Width() - rcClientNew.Width();   
        rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
        // 移动对话框
        MoveWindow(rcWindow,FALSE);   
    
        // 显示状态栏
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
    }

    运行结果:

    单/多文档

    相关函数:

    代码示例:

    在文档中添加状态栏,这个功能只能在框架类中完成(即 CFrameWnd 类),由于一生成 单文档/多文档 工程时候,会为程序添加一个默认的状态栏.为了希望在这个默认的状态栏上添加资源图标(资源 ID 为 IDI_ICON1,IDI_ICON2),定义的两个图标资源视图如下:

    这个状态栏的添加在框架类的初始化(即 OnCreate 函数)中,而窗格的索引值在框架类的实现文件头出定义,具体代码如下(省略了无关代码):

    View Code
    ...
    // 状态行指示器对应 ID
    static UINT indicators[] =
    {
        ID_SEPARATOR,           // 状态行指示器
        ID_INDICATOR_CAPS,
        ID_INDICATOR_NUM,
        ID_INDICATOR_SCRL,
    };
    
    ...
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        ...
    
        if (!m_wndStatusBar.Create(this) ||
            !m_wndStatusBar.SetIndicators(indicators,
              sizeof(indicators)/sizeof(UINT)))
        {
            TRACE0("未能创建状态栏\n");
            return -1;      // 未能创建
        }
    
        /* 以下是我为状态栏添加图标的实现代码 *****************/
        //为状态栏指示器添加图标
        HICON icon[2];
        icon[0] = AfxGetApp()->LoadIcon (IDI_ICON1);
        icon[1] = AfxGetApp()->LoadIcon (IDI_ICON2);
        m_wndStatusBar.GetStatusBarCtrl().SetIcon(0,icon[0]);
        m_wndStatusBar.GetStatusBarCtrl().SetIcon(1,icon[1]);
        m_wndStatusBar.GetStatusBarCtrl().SetIcon(2,icon[0]);
        m_wndStatusBar.GetStatusBarCtrl().SetIcon(3,icon[1]);
        //设置状态栏高度
        m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(50);
    
        // 设置状态栏指示器属性
        m_wndStatusBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NORMAL   ,100);
        m_wndStatusBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL   ,100);
        m_wndStatusBar.SetPaneInfo(2,ID_INDICATOR_NUM,SBPS_NORMAL   ,100);
        m_wndStatusBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL   ,100);
    
        return 0;
    }
    
    ....

    运行结果:

  • 相关阅读:
    Codeforces Beta Round #69 (Div. 2 Only)
    Codeforces Beta Round #67 (Div. 2)
    Codeforces Beta Round #65 (Div. 2)
    UmBasketella
    Codeforces Beta Round #63 (Div. 2)
    [agc004d]Teleporter
    [arc076f]Exhausted?
    NOIp模拟赛二十八
    CDQ分治笔记
    (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
  • 原文地址:https://www.cnblogs.com/kzang/p/2787341.html
Copyright © 2020-2023  润新知