VS2015 MFC 状态栏编程
一 VS2015MFC 中自带的状态栏创建过程
1.1 成员变量 protected CStatusBar m_wndStatusBar;
1.2 CMainFrame::OnCreate()中m_wndStatusBar.Create(this);创建CStatusBar对象
1.3 CMainFrame::OnCreate()中设置指示器 m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); SetIndicators函数的第二个参数:表示数组中元素的个数
1.3.1 indicators它是一个static UINT 类型的数组,用于设定元素窗口的数目,原始的定义如下:
static UINT indicators[] = { ID_SEPARATOR, // 状态行指示器 ID_INDICATOR_CAPS, // CapsLock键 定义在String Table中 ID_INDICATOR_NUM, // NumLock键 定义在String Table中 ID_INDICATOR_SCRL, // 滚动 定义在String Table中 };
1.3.2 如果要修改状态栏中元素窗口的数目,可以在这个数组中添加或者删除字符串ID。要在状态栏中增加一个窗格,现在StringTable中先增加一个字符串资源
String Table中增加以下两个字符串资源 IDS_TIMER 时钟 IDS_PROGRESS 进度条 static UINT indicators[] = { ID_SEPARATOR, // 状态行指示器 IDS_TIMER, // String Table中预先定义了 IDS_PROGRESS, // String Table中预先定义了 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; //运行程序 可以看到状态栏比之前多了两个格子:时钟|进度条
1.4 给窗格填充内容 时钟为系统时间,进度栏显示进度
SetTimer(1, 1000, NULL); CTime t = CTime::GetCurrentTime(); CString strTime = t.Format("%H:%M:%S");//设置时间显示格式 //m_wndStatusBar.SetPaneText(1, strTime); 如果知道索引号 //如果不知道索引号,可以通过状态栏对象的成员函数CommandToIndex函数获取到索引值 int indexTime; indexTime=m_wndStatusBar.CommandToIndex(IDS_TIMER); m_wndStatusBar.SetPaneText(indexTime, strTime); //上面存在一个问题,格子不能显示完整的时间字符串,需要设置格子的宽度
修改以上代码如下
CTime t = CTime::GetCurrentTime(); CString strTime = t.Format("%H:%M:%S");//设置时间显示格式 //m_wndStatusBar.SetPaneText(1, strTime); 如果知道索引号 //如果不知道索引号,可以通过状态栏对象的成员函数CommandToIndex函数获取到索引值 CClientDC dc(this); CSize sz = dc.GetTextExtent(strTime); //获取字符串信息,包括宽度 int indexTime; indexTime=m_wndStatusBar.CommandToIndex(IDS_TIMER); m_wndStatusBar.SetPaneInfo(indexTime,IDS_TIMER,SBPS_NORMAL,sz.cx); //设置格子宽度以适配字符串宽度 m_wndStatusBar.SetPaneText(indexTime, strTime); //这样设置后,还有一个问题是,时间是静止的,需要不断的变化,考虑把它放在定时器里面