Toolkit Pro学习--Toolbar的创建

一、新建Toolkit Pro应用程序

  安装好Toolkit Pro后,打开VS2008,新建-项目-Toolkit Pro Application。如图1所示。

  

                     图1:Toolkit Pro创建窗口 

  输入项目名称和位置,如Test,一直默认直到工程建立好。

  系统将生成四组文件:CTestCView类、CTestDoc类、CChildFrame类、CMainFrame类,及相应的.h和.cpp文件。

二、MFC状态栏介绍

  首先在CMainFrame.cpp中找到OnCreate()函数,可以看到该框架已自动创建了状态栏:

1     if (!m_wndStatusBar.Create(this) ||
2         !m_wndStatusBar.SetIndicators(indicators,
3         sizeof(indicators)/sizeof(UINT)))
4     {
5         TRACE0("Failed to create status bar\n");
6         return -1;      // fail to create
7     }

  1.m_wndStatusBar

  m_wndStatusBar为CMainFrame类定义的一个成员对象:

  protected:CXTPStatusBar  m_wndStatusBar;

  2. Create()函数

1 BOOL Create(
2     // 状态栏父窗口指针
3     CWnd* pParentWnd,       
4     // 状态栏的风格          
5     DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 
6     // 状态栏的ID
7     UINT nID = AFX_IDW_STATUS_BAR
8     );

  3.SetIndicators()函数

1 BOOL SetIndicators(
2     const UINT* lpIDArray,  // 指定指示器的ID
3     int nIDCount);          // 状态栏窗格中显示的文本

  4.indicator数组

  SetIndicators()函数的第一个参数已指定为indicate数组,为窗格ID数组。

1 static UINT indicators[] =
2 {
3     ID_SEPARATOR,           // status line indicator
4     ID_INDICATOR_CAPS,
5     ID_INDICATOR_NUM,
6     ID_INDICATOR_SCRL,
7 };

  其中ID_INDICATOR_CAPS表示Caps Lock按键,即大小写按键

    ID_INDICATOR_NUM 表示Num Lock按键,即小键盘按键  

    ID_INDICATOR_SCRL表示Scroll Lock按键,在键盘大小写指示灯左侧第二个按钮

  程序默认运行效果如图2所示:

  

                   图2:Toolkit Pro应用程序默认状态栏

  从图2红色框中可见,状态栏加载了四个窗格,标题分别是:Ready,CAP,NUM,SCRL。

  第一个窗格为默认窗格,一般可以通过SetText来覆盖其名称来显示想要的内容。

  第二个窗格为CAP Lock按键状态,在键盘上按下CAP Lock按键后该窗格的CAP标题处于激活状态。

  第三个窗格为NUM Lock按键状态,默认为激活状态,在键盘上按下NUM Lock后该窗口标题变为灰色。

  第四个窗格为SCroll Lock按键状态,按下对应按钮标题激活。

三、设置自定义状态栏

  要想得到自己想要的状态栏效果,可以重写状态栏。

  1.将MainFrame.cpp中OnCreate的工具栏创建代码注释,添加自己写的CreateStatusBar()函数:

 1 //if (!m_wndStatusBar.Create(this) ||
 2 //    !m_wndStatusBar.SetIndicators(indicators,
 3 //      sizeof(indicators)/sizeof(UINT)))
 4 //{
 5 //    TRACE0("Failed to create status bar\n");
 6 //    return -1;      // fail to create
 7 //} 
 8 
 9 if (!CreateStatusBar())
10 {
11     TRACE0("Failed to create status bar\n");
12     return -1;
13 }

  2.在资源中建立PNG分组,加入两个PNG图片,分别命名为ID_SCREEN_TUBE和ID_SCREEN_NULL

  3.CreateStatusBar()具体实现如下:

 1 // 创建状态栏
 2 BOOL CMainFrame::CreateStatusBar()
 3 {
 4   // 状态栏创建
 5     if (!m_wndStatusBar.Create(this))
 6     {
 7         return FALSE;
 8     }
 9 
10     // 状态栏面板
11     CXTPStatusBarPane* pPane;
12 
13     // 状态栏面板-添加指示器,完成第一个窗格的初始化
14     pPane = m_wndStatusBar.AddIndicator(ID_SEPARATOR);
15     // 状态栏面板-设置宽度
16     // 如果SetStyle设置了可拉伸属性SBPS_STRETCH,则无需SetWidth
17     // pPane->SetWidth(1);
18     // 状态栏面板-设置面板类型:可拉伸+无边框
19     pPane->SetStyle(SBPS_STRETCH | SBPS_NOBORDERS); 
20     pPane->SetBeginGroup(TRUE);
21 
22     // 状态栏面板-添加指示器,完成第二个窗格的初始化
23     pPane = m_wndStatusBar.AddIndicator(ID_SCREEN_TUBE);
24     // 状态栏面板-设置按钮,调用该函数使窗格可点击,否则为文本状态。
25     pPane->SetButton();
26     // 状态栏面板-设置填充物(左,高,右,宽)
27     pPane->SetPadding(8, 0, 8, 0);
28     // 状态栏面板-设置图标索引
29     pPane->SetIconIndex(ID_SCREEN_TUBE);
30     pPane->SetBeginGroup(TRUE);
31 
32     // 状态栏面板-加载图片
33     UINT nID_Link = ID_SCREEN_TUBE;
34     m_wndStatusBar.GetImageManager()->SetIcons(ID_SCREEN_TUBE, &nID_Link, 1, 0);
35 
36   // 状态栏面板-设置第三个窗格
37     pPane = m_wndStatusBar.AddIndicator(ID_SCREEN_NULL);
38     pPane->SetButton();
39     pPane->SetPadding(8, 0, 8, 0);
40     pPane->SetBeginGroup(TRUE);
41     // 状态栏面板-设置窗格标题
42     pPane->SetText(_T("状态指示灯"));
43 
44     UINT nID_UnLink = ID_SCREEN_NULL;
45     m_wndStatusBar.GetImageManager()->SetIcons(ID_SCREEN_NULL,     &nID_Link, 1, 0);
46 
47     return TRUE;
48 }

  4.运行效果如图3所示:

  

                图3:自定义状态栏

  5.添加其他窗格

  在CreateStatusBar()函数后面添加代码。

1 pPane = m_wndStatusBar.AddIndicator(ID_STATUSBAR_TITLE);
2 pPane->SetButton();
3 pPane->SetPadding(8, 0, 8, 0);
4 pPane->SetBeginGroup(TRUE);
5 pPane->SetText(_T("Title"));

  其中ID_STATUSBAR_TITLE是Resource.h中添加的宏:#define ID_STATUSBAR_TITLE 6001,具体数字与其他宏不冲突即可。

  运行效果如图4所示:

  

                图4:添加窗格

  6.添加时间窗格

  添加时间响应消息;添加SetTimer函数;实现时间消息响应函数OnTimer:

 1 void CMainFrame::OnTimer(UINT_PTR nIDEvent)   
 2 {   
 3     // TODO: Add your message handler code here and/or call default   
 4     CString strTime;   
 5     // 获取系统当前时间,并保存到curTime   
 6     CTime curTime = CTime::GetCurrentTime();   
 7 
 8     // 格式化curTime,将字符串保存到strTime   
 9     strTime = curTime.Format(_T("%H:%M:%S"));   
10     // 在状态栏的时间窗格中显示系统时间字符串   
11     m_wndStatusBar.SetPaneText(3, strTime);   
12 
13     CMDIFrameWnd::OnTimer(nIDEvent);   
14 }  

  注意:1)代码11行SetPaneText()函数第一个参数为窗格索引号,从0开始。

     2)若该参数值大于已设定的窗口数,windows会弹出Debug Assertion Failed对话框。比如只添加了3个窗格,那么该参数值的范围就只能是0-2,若设成比2大的值如4就会报错。    

  添加时间窗格详见http://www.jizhuomi.com/software/219.html 《VS2010/MFC编程入门之三十八(状态栏的使用详解)》。

posted on 2015-03-25 17:09  306573704  阅读(563)  评论(0编辑  收藏  举报

导航