专题:编辑状态栏

本文详述了如何在应用程序中添加和管理状态栏,包括添加状态显示框、定义资源标识、控制显示状态、设置系统时间和Shift键状态、以及显示鼠标移动效果的方法。通过这些步骤,可以增强用户界面的交互性和反馈信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:

 //添加状态显示框,在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 类型的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值