精通 VC++ 实效编程280例 - 03 控制栏

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\n" );
         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\n" );
         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( '\n' ));
         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\n" );
         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\n" );
         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\n" );
         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\n" );
         return  -1;      // fail to create
     }
 
     //创建组合框
     if  (!CreateComboBox(ID_COMBOBOX))
     {
         TRACE0( "Failed to create combo box\n" );
         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
邮箱:[email protected]
出处:http://www.iwanc.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

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

 

你可能感兴趣的:(vc++)