• 精通 VC++ 实效编程280例


    Windows 应用程序的控制栏包括工具栏和状态栏等。在工具栏中可以添加按钮和控件,实现快捷操作。在状态栏中可以显示一些提示信息。MFC 中,控制栏中的工具栏和状态栏分别通过 CToolBar 类和 CstatusBar 类实现,它们的父类都为 CContorlBar 类。

    33 创建工具栏

    创建工具栏,首先创建一个工具栏资源,然后构造一个 CToolBar 类对象,接下来调用 CToolBar::CreateEx 函数创建工具栏窗口,最后调用 CToolBar::LoadToolBar 函数加载工具栏资源。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //创建1个多文档的应用程序,添加1个工具栏资源,ID为IDR_TOOLBAR,在CMainFrame类中添加成员变量
    public:
        CToolBar m_wndDemoToolBar;
    //在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
            //...
        //创建工具栏窗口
        if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
        {
            return -1;
        }
        //加载工具栏资源
        if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
        {
            return -1;
        }
        return 0;
    }

    34 设置工具栏标题

    设置工具栏的标题可以调用CWnd::SetWindowText函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::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("Failed to create toolbar ");
            return -1;      // fail to create
        }
        //设置工具栏标题
        CString strText = _T("");
        strText.LoadString(AFX_IDS_APP_TITLE);
        m_wndToolBar.SetWindowText(strText);
            //...
            return 0;
    }

    35 停靠工具栏

    停靠工具栏,首先调用CControlBar::EnableDocking函数和CFrameWnd::EnableDocking函数,然后调用CFrameWnd::DockControlBar函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    //创建1个多文档的应用程序,添加1个工具栏资源,ID为IDR_TOOLBAR,在CMainFrame类中添加成员变量
    public:
        CToolBar m_wndDemoToolBar;
    //在CMainFrame类中添加DockBar成员函数
    void CMainFrame::DockBar(CControlBar* pDestBar, CControlBar* pSrcBar)
    {
        RecalcLayout(TRUE);
         
        //获得工具栏窗口坐标
        CRect rect;
        pDestBar->GetWindowRect(&rect);
        rect.OffsetRect(1, 0);
         
        //获得工具栏风格
        DWORD dwStyle = pDestBar->GetBarStyle();
         
        UINT nDockBarID = 0;
         
        if (dwStyle & CBRS_ALIGN_TOP)
        {
            nDockBarID = AFX_IDW_DOCKBAR_TOP;
        }
        else if (dwStyle & CBRS_ALIGN_BOTTOM)
        {
            nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
        }
        else if (dwStyle & CBRS_ALIGN_LEFT)
        {
            nDockBarID = AFX_IDW_DOCKBAR_LEFT;
        }
        else if (dwStyle & CBRS_ALIGN_RIGHT)
        {
            nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
        }
         
        //停靠工具栏
        DockControlBar(pSrcBar, nDockBarID, &rect);
    }
    //在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
            //...
        //创建工具栏窗口
        if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
        {
            return -1;
        }
        //加载工具栏资源
        if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
        {
            return -1;
        }
        return 0;
    }

    36 设置工具栏位图

    设置工具栏的位图可以调用CToolBar::SetBitmap函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    //创建1个多文档的应用程序,添加1个工具栏资源,ID为IDR_TOOLBAR,添加1个位图资源,ID为IDB_BITMAP1,在CMainFrame类中添加成员变量
    public:
        CToolBar m_wndDemoToolBar;
        CBitmap m_Bitmap;
    //在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
            //...
        //创建工具栏窗口
        if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
        {
            return -1;
        }
        //加载工具栏资源
        if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
        {
            return -1;
        }
        //停靠工具栏
        m_wndDemoToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockBar(&m_wndToolBar,&m_wndDemoToolBar);
        //设置位图
        m_Bitmap.LoadBitmap(IDB_BITMAP1);
        m_wndDemoToolBar.SetBitmap((HBITMAP)m_Bitmap);
        return 0;
    }

    37 为工具栏按钮添加文本标签

    为工具栏按钮添加文本标签可以调用CToolBar::SetButtonText函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    //创建1个多文档的应用程序,在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::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("Failed to create toolbar ");
            return -1;      // fail to create
        }
        for (int n = 0;n < m_wndToolBar.GetCount();n++)
        {
            //获得工具栏按钮ID
            UINT nID = m_wndToolBar.GetItemID(n);
            CString strText = _T("");
            if (!strText.LoadString(nID))
            {
                continue;
            }
            int nIndex = strText.Find(_T(' '));
            if (nIndex < 0)
            {
                continue;
            }
            strText = strText.Right(strText.GetLength() - nIndex - 1);
            //设置工具栏按钮文本
            m_wndToolBar.SetButtonText(n,strText);
        }
        CRect rect;
        m_wndToolBar.GetItemRect(0,&rect);
        //设置工具栏按钮尺寸
        m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));
            //...
            return 0;
    }

    38 为工具栏按钮添加下拉箭头

     为工具栏按钮添加下拉箭头,首先调用CToolBarCtrl::SetExtendedStyle函数,设置工具栏的TBSTYLE_EX_DRAWDDARROWS风格;然后调用CToolBar::SetButtonStyle函数,在每一个添加下拉箭头的按钮上设置TBSTYLE_DROPDOWN风格。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    //创建1个多文档的应用程序,在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::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("Failed to create toolbar ");
            return -1;      // fail to create
        }
        //设置工具栏扩展风格
        m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
        //设置工具栏按钮风格
        int nIndex = m_wndToolBar.CommandToIndex(ID_FILE_NEW);
        UINT nStyle = m_wndToolBar.GetButtonStyle(nIndex);
        nStyle |= TBSTYLE_DROPDOWN;
        m_wndToolBar.SetButtonStyle(nIndex, nStyle);
        //...
        return 0;
    }
    //在CMainFrame类中为工具栏添加TBN_DROPDOWN消息处理函数
    //在MainFrame.h头文件中加入消息处理函数的声明:
          afx_msg void OnDropDownToolBar(NMHDR* pNMHDR, LRESULT* pResult);
    //在MainFrame.cpp中加入下拉箭头的TBN_DROPDOWN消息映射:
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
        //{{AFX_MSG_MAP(CMainFrame)
        ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDownToolBar)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP() 
    //TBN_DROPDOWN消息的实现:
    void CMainFrame::OnDropDownToolBar(NMHDR* pNMHDR, LRESULT* pResult)
    {
        NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNMHDR;
     
        switch(pNMToolBar->iItem)
        {
        case ID_FILE_NEW:
            ::AfxMessageBox(_T("新建"));
            break;
        default:
            break;
        }
    }

    39 为工具栏按钮设置热点图像

    默认情况下,AppWizard使用工具栏资源来设置按钮的图像。工具栏资源包含一个复合的位图,该位图在调用CToolbar::LoadToolBar函数时将被转换成一个图像列表。

    为工具栏按钮设置热点图像,应该首先调用CImageList::Create函数创建一个新的图像列表;然后调用CToolBarCtrl::SetHotImageList函数,将该图像列表设置为工具栏的热点图像列表。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    //创建1个多文档的应用程序,在CMainFrame类中添加成员变量和WM_CREATE消息处理函数
    private:
        CImageList m_ImageList;
     
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::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("Failed to create toolbar ");
            return -1;      // fail to create
        }
        //创建图像列表
        if (!m_ImageList.Create(IDB_BITMAP1,16,0,RGB(128,128,128)))
        {
            return -1;
        }
        //设置工具栏图像列表
        m_wndToolBar.GetToolBarCtrl().SetHotImageList(&m_ImageList);
        //...
        return 0;
    }

    40 启用或禁用工具栏的工具提示

    启用和禁用工具栏的工具提示,可以通过调用CControlBar::SetBarStyle函数,添加或删除CBRS_TOOLTIPS风格实现。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //创建1个多文档的应用程序,分别在IDR_MAINFRAME和IDR_DEMOTYPE菜单资源中添加1个子菜单,在子菜单中添加1个菜单项(ID:ID_ENABLE_TOOLTIPS)
    //在CMainFrame类中为菜单项添加命令处理函数
    void CMainFrame::OnEnableTooltips()
    {
        //获得工具栏风格
        DWORD dwStyle = m_wndToolBar.GetBarStyle();
         
        //启用或禁用工具提示
        if (dwStyle & CBRS_TOOLTIPS)
        {
            dwStyle &= ~CBRS_TOOLTIPS;
        }
        else
        {
            dwStyle |= CBRS_TOOLTIPS;
        }
         
        //设置工具栏风格
        m_wndToolBar.SetBarStyle(dwStyle);
    }
     
    void CMainFrame::OnUpdateEnableTooltips(CCmdUI* pCmdUI)
    {
        //获得工具栏风格
        DWORD dwStyle = m_wndToolBar.GetBarStyle();
         
        if (dwStyle & CBRS_TOOLTIPS)
        {
            pCmdUI->SetCheck(TRUE);
        }
        else
        {
            pCmdUI->SetCheck(FALSE);
        }
    }

    41 在工具栏中添加组合框

    在工具栏中添加组合框,应该首先调用CToolBar::SetButtonInfo函数,为组合框创建一个空白区域(TBBS_SEPARATOR), 然后调用CToolBar::GetItemRect函数,获得空白区域的大小和位置,最后调用CComboBox::Create函数,在空白区域创建组合框。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    //创建1个多文档的应用程序,在CMainFrame类中添加成员变量
    CComboBox m_ComboBox;
    //在CMainFrame类中添加CreateComboBox成员函数
    BOOL CMainFrame::CreateComboBox(UINT nID)
    {
        int nIndex = 0;
        CRect rect;
     
        //查找按钮
        while (m_wndToolBar.GetItemID(nIndex) != nID)
        {
            nIndex++;
        }
     
        //为组合框创建一个空白区域
        m_wndToolBar.SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, 80);
     
        //获得空白区域大小和位置
        m_wndToolBar.GetItemRect(nIndex, &rect);
     
        //组合框大小和位置
        rect.top += 0;
        rect.bottom += 200;
     
        //在空白区域创建组合框
        if (!m_ComboBox.Create(WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL |
            CBS_DROPDOWNLIST | CBS_HASSTRINGS, rect, &m_wndToolBar, nID))
        {
            TRACE0("Failed to create combo-box ");
            return FALSE;
        }
     
        //显示组合框
        m_ComboBox.ShowWindow(SW_SHOW);
     
        //在组合框中添加字符串
        m_ComboBox.AddString("500%");
        m_ComboBox.AddString("200%");
        m_ComboBox.AddString("150%");
        m_ComboBox.AddString("100%");
        m_ComboBox.AddString("75%");
        m_ComboBox.AddString("50%");
        m_ComboBox.AddString("25%");
        m_ComboBox.AddString("10%");
        m_ComboBox.SetCurSel(3);
     
        return TRUE;
    }
    //在CMainFrame类中添加WM_CREATE消息才处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::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("Failed to create toolbar ");
            return -1;      // fail to create
        }
     
        //创建组合框
        if (!CreateComboBox(ID_COMBOBOX))
        {
            TRACE0("Failed to create combo box ");
            return -1;
        }
        //...
        return 0;
    }
    //在CMainFrame类中为组合框添加CBN_SELCHANGE消息处理函数
    void CMainFrame::OnSelchangeCombobox()
    {
        CString strText = _T("");
        m_ComboBox.GetWindowText(strText);
        AfxMessageBox(strText);
    }

    42 创建状态栏

    创建状态栏,首先构造一个CStatusBar类对象,然后调用CStatusBar::Create函数创建状态栏窗口,最后调用CStatusBar::SetIndicators函数设置状态栏指示器。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    //创建1个多文档的应用程序,在CMainFrame类中添加成员变量
    protected:
        CStatusBar m_wndDemoStatusBar;
    //在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
        //...
        //创建状态栏窗口
        if (!m_wndDemoStatusBar.Create(this))
        {
            return -1;
        }
         
        //ID数组
        UINT IDArray[2];
        for (int n = 0; n < 2; n++)
        {
            IDArray[n] = 10000 + n;
        }
         
        //设置状态栏指示器
        m_wndDemoStatusBar.SetIndicators(IDArray, sizeof(IDArray) / sizeof(UINT));
         
        //设置窗格宽度
        m_wndDemoStatusBar.SetPaneInfo(0, IDArray[0], SBPS_NORMAL, 100);
        m_wndDemoStatusBar.SetPaneInfo(1, IDArray[1], SBPS_STRETCH, 0);
         
        //设置窗格文本
        m_wndDemoStatusBar.SetPaneText(0, _T("状态栏:"));
        m_wndDemoStatusBar.SetPaneText(1, _T(""));
        return 0;
    }

    43 在状态栏中添加进度条

    在状态栏中添加进度条,应该首先调用CProgressCtrl::Create函数,创建进度条,然后调用CStatusBar::GetItemRect函数,获得指示器大小和位置,最后调用CWnd::MoveWindow函数移动进度条窗口。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    //创建1个多文档的应用程序,添加1个基类为CStatusBar的类CProgressStatusBar
    //在CProgressStatusBar类中添加成员变量
    public:
        CProgressCtrl m_Progress;
    //在CProgressStatusBar类中添加WM_CREATE和WM_SIZE消息处理函数
    int CProgressStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CStatusBar::OnCreate(lpCreateStruct) == -1)
            return -1;
         
        //创建进度条
        m_Progress.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0),
            this, 1);
         
        return 0;
    }
     
    void CProgressStatusBar::OnSize(UINT nType, int cx, int cy)
    {
        CStatusBar::OnSize(nType, cx, cy);
     
        //获得指示器大小和位置
        CRect rect;
        GetItemRect(0, &rect);
         
        //移动进度条窗口
        m_Progress.MoveWindow(rect.left + 1, rect.top, rect.Width() - 2, rect.Height());   
    }
    //在CMainFrame类中添加成员变量
    protected:
        CProgressStatusBar m_wndProgressStatusBar;
    //在CMainframe类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
        //...
            //创建状态栏窗口
        if (!m_wndProgressStatusBar.Create(this))
        {
            return -1;
        }
         
        //ID数组
        UINT IDArray[2];
        for (int n = 0; n < 2; n++)
        {
            IDArray[n] = 10000 + n;
        }
         
        //设置状态栏指示器
        m_wndProgressStatusBar.SetIndicators(IDArray, sizeof(IDArray) / sizeof(UINT));
         
        //设置窗格宽度
        m_wndProgressStatusBar.SetPaneInfo(0, IDArray[0], SBPS_NORMAL, 200);
        m_wndProgressStatusBar.SetPaneInfo(1, IDArray[1], SBPS_STRETCH, 0);
         
        //设置窗格文本
        m_wndProgressStatusBar.SetPaneText(0, _T(""));
        m_wndProgressStatusBar.SetPaneText(1, _T(""));
         
        //设置进度条
        m_wndProgressStatusBar.m_Progress.SetRange(0, 100);
        m_wndProgressStatusBar.m_Progress.SetStep(10);
        m_wndProgressStatusBar.m_Progress.SetPos(50);
        return 0;
    }

    44 显示或隐藏工具栏和状态栏

    显示或隐藏工具栏和状态栏,可以调用CFrameWnd::ShowControlBar函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    //创建1个多文档的应用程序,分别在IDR_MAINFRAME和IDR_DEMOTYPE菜单资源中添加1个子菜单,在子菜单中添加2个菜单项(显示工具栏:ID_SHOW_TOOLBAR,显示状态栏:ID_SHOW_STATUSBAR)
    void CMainFrame::OnShowToolbar()
    {
        if (m_wndToolBar.GetStyle() & WS_VISIBLE)
        {
            //隐藏工具栏
            ShowControlBar(&m_wndToolBar, FALSE, FALSE);
        }
        else
        {
            //显示工具栏
            ShowControlBar(&m_wndToolBar, TRUE, FALSE);
        }  
    }
     
    void CMainFrame::OnUpdateShowToolbar(CCmdUI* pCmdUI)
    {
        if (m_wndToolBar.GetStyle() & WS_VISIBLE)
        {
            pCmdUI->SetCheck(TRUE);
        }
        else
        {
            pCmdUI->SetCheck(FALSE);
        }  
    }
     
    void CMainFrame::OnShowStatusbar()
    {
        if (m_wndStatusBar.GetStyle() & WS_VISIBLE)
        {
            //隐藏状态栏
            ShowControlBar(&m_wndStatusBar, FALSE, FALSE);
        }
        else
        {
            //显示状态栏
            ShowControlBar(&m_wndStatusBar, TRUE, FALSE);
        }  
    }
     
    void CMainFrame::OnUpdateShowStatusbar(CCmdUI* pCmdUI)
    {
        if (m_wndStatusBar.GetStyle() & WS_VISIBLE)
        {
            pCmdUI->SetCheck(TRUE);
        }
        else
        {
            pCmdUI->SetCheck(FALSE);
        }
    }

    45 使用组合栏

    首先调用 CReBar::Create 函数创建组合栏,然后调用 CReBar::AddBar 函数在组合栏中添加带区。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    //在resource.h头文件中添加宏定义
    #define IDC_COMBOBOX                    1000
    #define IDC_TEST                               1001
    //在CMainFrame类中添加成员变量
    protected:
        CReBar m_wndReBar;
        CComboBox m_ComboBox;
        CButton m_Button;
    //在CMainFrame类中添加WM_CREATE消息处理函数
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
            //...
        //创建组合框
        if (!m_ComboBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL |
            CBS_DROPDOWN, CRect(0, 0, 100, 200), this, IDC_COMBOBOX))
        {
            return FALSE;
        }
         
        //创建按钮
        m_Button.Create(_T("确定"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
            CRect(0, 0, 50, 20), this, IDC_TEST);
         
        //创建Rebar
        if (!m_wndReBar.Create(this))
        {
            return -1;
        }
         
        //添加工具栏、组合框、按钮添加到Rebar中
        m_wndReBar.AddBar(&m_wndToolBar);
        m_wndReBar.AddBar(&m_ComboBox, NULL, NULL, 
            RBBS_NOGRIPPER | RBBS_BREAK);
        m_wndReBar.AddBar(&m_Button, NULL, NULL, RBBS_NOGRIPPER);
            return 0;
    }
    //在CMainFrame类中为Button控件添加BN_CLICKED消息处理函数
    void CMainFrame::OnTest()
    {
        CString strText = _T("");
        m_ComboBox.GetWindowText(strText);
     
        if ((!strText.IsEmpty()) && (CB_ERR == m_ComboBox.FindString(-1, strText)))
        {
            m_ComboBox.AddString(strText);
        }
     
        AfxMessageBox(strText);
    }

    作者:爱玩C
    邮箱:iwanc@qq.com
    出处:http://www.iwanc.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    转自:http://www.cnblogs.com/iwanc/archive/2013/06/10/3129837.html

  • 相关阅读:
    数据窗口的缓冲区
    RowsMove()
    update
    defparameter defconstant
    1+ 1
    原则
    incf decf
    eql equal
    上司找谈话
    判断回文的函数palindrome?
  • 原文地址:https://www.cnblogs.com/vranger/p/3986646.html
Copyright © 2020-2023  润新知