精通 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);

}

时间: 2024-10-21 06:09:32

精通 VC++ 实效编程280例 - 03 控制栏 [转]的相关文章

精通 VC++ 实效编程280例 - 01 窗口[转]

窗口是屏幕上的一个矩形区域.窗口分为3种:重叠窗口.弹出窗口和子窗口.每个窗口都有由系统绘制的“非客户区”和应用程序绘制的“客户区”.在 MFC 中,CWnd 类为各种窗口提供了基类. 1 通过 HWND 获得 CWnd 指针 通过 HWND 获得 Cwnd 指针可以调用 Cwnd::FromHandle 函数. 1 2 3 4 5 6 7 8 void CDemoDlg::OnButton1() {     HWND hWnd = GetSafeHwnd();  //获得当前窗口的句柄    

精通 VC++ 实效编程280例 - 02 菜单和光标[转]

菜单和关闭时重要的 Windows 资源之一.SDK 中,用 HCURSOR 和 HMENU 分别表示菜单和光标的句柄.MFC 中,CMenu 类封装了菜单的功能. 23 动态添加和删除菜单项 添加菜单项可以调用 CMenu::AppendMenu 或 CMenu::InserMenu 函数,删除菜单项可以调用 CMenu::RemoveMenu 或 CMenu::DeleteMenu 函数,最后调用 CWnd::DrawMenuBar 函数重画菜单. CMenu::AppendMenu:在菜单

VC/MFC 编程技巧大总结

1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐:<java编程思想> 4 在VC下执行DOS命令 a. system("md c:\\12"); b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE); c. ShellExecute ShellExecute(NULL,

ios学习记录 day44 UI20 Storyboard 高级可视化编程 + 单例

可视化编程 : 5.0之前 xib  5.0之后 Storyboard 注意事项:1.在AppDelegate中不用代码初始化一个window   2.在general  设置 Main Interface(创建的时候自动设置的) weak可以指向 但是没有拥有权   strong有拥有权 单例特性: 1.唯一性  创建的对象永远指向同一块内存地址     2.不释放   从打开程序到后台关闭 对象都不释放 单例安全:加锁@synchronized  防止同一块内存被创建两次,破坏唯一性 //单

(六) 一起学 Unix 环境高级编程(APUE) 之 进程控制

. . . . . 目录 (一) 一起学 Unix 环境高级编程(APUE) 之 标准IO (二) 一起学 Unix 环境高级编程(APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程(APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程(APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程(APUE) 之 进程控制 上一篇博文中我们讨论了进程环境,相信大家对进程已经有了初步的认识

Spark2.0从入门到精通:Scala编程、大数据开发、上百个实战案例、内核源码深度剖析视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

Python黑帽编程2.4 流程控制

Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # -*- coding: UTF-8 -*- x=int(input('请输入一个整数:')) if x==0: print '%d ==0' % x elif x<0: print '%d <0' % x else: print '%d >0' % x 这段代码使用if,elif和else三个

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

VC++界面编程之--仿Facebook透明登录窗口

1. 开发工具:VC++ DUIEngine: 该工程由DUIEngine创建,没了解过DUIE的同学,可以看前面的DUIE配置文章:点击打开链接 编译DUIE工程时,请选择"全部重新构建"构建所有的工程,以确保所有的更改都能生效.因为当你修改XML文件后,VS不会把其当做更新项,进行重新构建. 2. 制作图像文件,并拷贝至DUIE工程的skin\image文件夹下: DUIE的皮肤默认图像文件都是PNG类型的,所以尽量不要用bmp格式的,以免有些半透明的效果无法显示. 还有一点是:有