一、新建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 "); 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 "); 6 // return -1; // fail to create 7 //} 8 9 if (!CreateStatusBar()) 10 { 11 TRACE0("Failed to create status bar "); 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编程入门之三十八(状态栏的使用详解)》。