第一步:
//添加状态显示框,在MainFrm.cpp中
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_SEPARATOR, // 状态行指示器
ID_LINEBAR, //新增的状态显示框
ID_RECTANGLEBAR,
ID_INDICATOR_CLOCK,//时钟
ID_INDICATOR_SHIFT, //SHIFT键
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
第二步:
// 在String 表里添加资源表示符
ID 标题
ID_LINEBAR 画直线
ID_RECTANGLEBAR 画矩形
ID_INDICATOR_CLOCK 00:00:00
ID_INDICATOR_SHIFT 按下SHIFT键
第三步:
//在视图类定义是否显示字体变量
//view.h中
bool m_statusbarline; //是否显示状态显示框
bool m_statusbarrectangle;
//view.cpp中构造函数
m_statusbarline=false;
m_statusbarrectangle=false;
第四步:
//在视图类中定义是否显示的消息映射函数
//view.cpp中
ON_UPDATE_COMMAND_UI(ID_LINEBAR, OnUpdateLinebar)
ON_UPDATE_COMMAND_UI(ID_RECTANGLEBAR, OnUpdateRectanglebar)
//view.h中
afx_msg void OnUpdateLinebar(CCmdUI *pCmdUI);
afx_msg void OnUpdateRectanglebar(CCmdUI *pCmdUI);
//view.cpp中
void CVectorView::OnUpdateLinebar(CCmdUI *pCmdUI)
{
pCmdUI->Enable(m_statusbarline);
}
void CVectorView::OnUpdateRectanglebar(CCmdUI *pCmdUI)
{
pCmdUI->Enable(m_statusbarrectangle);
}
第五步:
//在视图画直线和矩形时改变显示
1.//画直线按钮
void CVectorView::OnItemLine()
{
if (m_nType == ITEM_LINE)
{
m_nType = ITEM_EMPTY;
}
else
{
m_nType = ITEM_LINE;
m_statusbarline=true; //新增
}
}
2.//画长方形按钮
void CVectorView::OnItemRectangle()
{
if (m_nType == ITEM_RECTANGLE)
{
m_nType = ITEM_EMPTY;
}
else
{
m_nType = ITEM_RECTANGLE;
m_statusbarrectangle=true; //新增
}
}
3.//控制各个按钮的属性
void CVectorView::OnUpdateItem(CCmdUI *pCmdUI)
{
switch (pCmdUI->m_nID)
{
case ID_Item_Line:
pCmdUI->SetCheck(m_nType == ITEM_LINE);
if(!(m_nType == ITEM_LINE)) //新增
{
m_statusbarline=false;
}
break;
case ID_Item_Rectangle:
pCmdUI->SetCheck(m_nType == ITEM_RECTANGLE);
if(!(m_nType == ITEM_RECTANGLE)) //新增
{
m_statusbarrectangle=false;
}
break;
default:
break;
}
}
第六步:
//设置系统时间
// 在主框架类中添加OnTimer和OnClose消息
1.//在MainFrm.cpp的OnCreate()中添加代码:
SetTimer(1,1000,NULL); //ONCREATE函数中 时间间隔设为1000毫秒
2.//在属性中选择WM_TIMER,在消息响应函数中添加代码:
CTime time;
time=CTime::GetCurrentTime(); //得到当前时间
CString s=time.Format("%H:%M:%S"); //转换时间格式
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s); //获得标识并显示时钟
3.//在属性中选择WM_CLOSE,在消息响应函数中添加代码:
KillTimer(1); //销毁定时器
第七步:
//设置Shift键
//MainFrm.cpp中:
ON_UPDATE_COMMAND_UI(ID_INDICATOR_SHIFT, OnUpdateKeyShift)
//MainFrm.h中:
afx_msg void OnUpdateKeyShift(CCmdUI *pCmdUI); //状态拦显示Shift键
//MianFrm.cpp中:
void CMainFrame::OnUpdateKeyShift(CCmdUI *pCmdUI)
{
pCmdUI->Enable(::GetKeyState(VK_LSHIFT)<0);
}
第八步:
//显示鼠标移动效果
法一:
//视图类鼠标移动事件中添加
char text[100];
CStatusBar* pStatus=(CStatusBar*)
AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_STATUSBAR);
if(pStatus)
{
wsprintf(text,"mouse.x=%d mouse.y=%d",point.x,point.y);
pStatus->SetPaneText(1,text);
pStatus->SetPaneStyle(1,SBPS_POPOUT);
}
在资源符号里添加资源标识
ID_STATUSBAR
在MainFrm.cpp重新创建状态栏
if (!m_wndStatusBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,ID_STATUSBAR)||! m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏/n");
return -1; // 未能创建
}
m_wndStatusBar.SetPaneInfo(0,ID_STATUSBAR,SBPS_POPOUT,230); //设置状态消息行的宽度
m_wndStatusBar.SetPaneInfo(1,ID_STATUSBAR,SBPS_POPOUT,230);
法二:
//在鼠标移动事件中添加:
char text[100];
CMainFrame *pMainFrame=(CMainFrame *)AfxGetApp()->GetMainWnd();
wsprintf(text,"mouse.x=%d mouse.y=%d",point.x,point.y);//输出到缓冲区text中
pMainFrame->m_wndStatusBar.SetPaneText(1,text);
pMainFrame->m_wndStatusBar.SetPaneStyle(1,SBPS_POPOUT);
注:这里别忘了,在MainFrm.h中把
CStatusBar m_wndStatusBar
这句的访问权限改成 public 类型的。