原文地址:http://welkangm.blog.163.com/blog/static/19065851020127941446182/

显示系统时间

1、 在状态栏中设置两个新的栏位Timer和Progress。首先到ResourceView中编辑String Table,增加IDS_TIMER(时间),PROGRESS(进度)。然后在MainFrame中修改indicators数组,插入IDS_TIMER和IDS_PROGRESS。插入的位置,即为显示的位置。(添加字符串必须将字符串说明也写上,不然无法新建)在CMainFrame中添加CProgressCtrl m_Progress;

2、 现在我们让状态栏上的IDS_TIMER的位置显示系统当前的时间。我们只要在MainFrame的OnCreate函数中写入:

CTimet=CTime::GetCurrentTime();          //获得当前的系统时间

CClientDC dc(this);
CSizesz=dc.GetTextExtent(str);              //设置一个CClientDC对象来获取str的长度
CStringstr=t.Format("%H:%M:%S");       //格式可以参考MSDN中的strftime函数
 int index=0;
 index=m_wndStatusBar.CommandToIndex(IDS_TIMER);

//此处也可以直接输入IDS_TIMER在indicators数组中从0开始的序号。

//设置状态栏宽度

m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);    
 m_wndStatusBar.SetPaneText(index,str);            //设置IDS_TIMER指示器字符串

3、 在OnCreate函数中添加SetTimer(1,1000,NULL);语句,让后为CMainFrame类添加WM_TIMER消息相应函数,在OnTimer函数中将上述代码复制进去,就可以实现随时变化时间的状态栏。

添加进度条:

1、 现在我们将状态栏中的PROGRESS栏位显示一个50%的进度栏。如果我们只是简单的在MainFrame的OnCreate函数中写入以下代码:

CRect rect;

/*获取IDS_PROGRESS栏位的CRect值,付给rect*/
 m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);

/*在IDS_PROGRESS的位置显示一个50%的进度栏*/
 m_progress.Create(WS_CHILD|WS_VISIBLE,rect,m_wndStatusBar,123);

m_progress.SetPos(50);

2、 你会发现IDS_PROGRESS栏位仍然显示的是“进度”两个字。这是为什么呢?原因是因为,在OnCreate函数中,窗台和状态栏并没有真正创建完毕,所以GetItemRect函数无法获取IDS_PROGRESS栏位的CRect值。解决的办法是,添加一个自定义的消息,把消息放入消息队列,等窗体和状态栏创建完毕后,再通过消息响应,创建进度栏。

添加自定义消息

1、 在MainFrame头文件中添加自定义消息

#define WM_PROGRESS WM_USER+1

2、 然后在头文件中添加消息响应函数

afx_msg LRESULT OnProgress(WPARAMwParam,LPARAM lParam);

在cpp文件中添加消息映射

ON_MESSAGE(WM_PROGRESS,CMainFrame::OnProgress)

3、 写消息响应函数:

void CMainFrame::OnProgress()
{
   CRect rect;
   m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
   if(m_Progress.GetSafeHwnd() == nullptr)

m_Progress.Create(WS_CHILD|WS_VISIBLE,rect, &m_wndStatusBar, 123);

else m_Progress.ShowWindow(SW_SHOW);

m_progress.SetPos(50);
}

4、 去掉上一个步骤在OnCreate中添加的语句。

然后在OnCreate函数最后添加如下语句:

PostMessage(WM_PROGRESS);

注意这里要用PostMessage不能用SendMessage,否则系统会先处理OnProgress消息响应,然后再创建窗体,出现仍看不见进度栏的情况。必须用PostMessage先把消息放入消息响应队列当中,等窗体创建完毕后,系统再处理OnProgress函数。

5、 这时就可以看见进度跳了,但是还有个问题,当窗口大小改变时,进度条会离开IDS_PROGRESS状态栏的位置。可以使用下面的方法解决。

状态栏随窗口改变大小

1、 为MainFrame添加WM_SIZE消息相应函数,并添加如下代码:

void CMainFrame::OnSize(UINT nType,int cx, int cy)

{

CFrameWndEx::OnSize(nType, cx, cy);

// TODO: 在此添加消息处理程序代码

if(m_wndStatusBar.GetSafeHwnd() != nullptr)

{

CRectrect;

m_wndStatusBar.GetItemRect(1,&rect);

if(m_Progress.GetSafeHwnd() != nullptr)

{

m_Progress.SetWindowPos(&wndTop,rect.left, rect.top,

rect.right- rect.left, rect.bottom - rect.top, 0);

}

}

}

显示鼠标位置

1.      现在我们要让状态栏上显示鼠标在窗口中的坐标。由于View窗体在MainFrame框架前,所以我们要响应的是View窗体上OnMouseMove事件。

2.      首先我们在View类中右键新建一个window消息响应函数,添加一个WM_MOUSEMOVE的消息响应函数。添加如下代码:

CStringstr;
       str.Format(_T("x=%d,y=%d"),point.x,point.y);                    /*对鼠标坐标进行格式化*/
     ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);

/*由于作用的是View窗口的父窗口MainFrame下的m_wndStatusBar对象,所以必须将m_wndStatusBar设置为public,然后用(CMainFrame*)指名其为框架类指针,否则->后面不会出现m_wndStatusBar对象。注意在View程序中必须包含MainFrame的头文件*/

也可以将最有一句改为: ((CMainFrame*)GetParent())->SetMessageText(str);直接由框架类函数中的SetMessageText实现对状态栏文字的更改。

3.      第三种实现方法是: ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);通过框架类函数GetMessageBar来获得指向状态栏窗口的指针。这种方法的好处是,不需要再把MainFrame中的m_wndStatusBar设置为public。

4.      第四种方法: GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str); 因为GetDescendantWindow本来就是CWnd的成员函数,所以不需要转换为框架类对象,并根据ID号,来获得子孙窗口的对象指针,这里的AFX_IDW_STATUS_BAR,是由CStatusBar::Create默认产生的。

 

状态栏编程(显示系统时间和进度条)相关推荐

  1. MFC状态栏编程(显示系统时间和进度条)

    显示系统时间 1. 在状态栏中设置两个新的栏位Timer和Progress.首先到ResourceView中编辑String Table,增加IDS_TIMER(时间),PROGRESS(进度).然后 ...

  2. 【MFC】显示系统时间的状态栏

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 状态栏主要用于显示程序 ...

  3. Qt实用技巧:使用OpenCV库的视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 需求 使用OpenCV库的视频播放器(支持播放器操作,如暂停.恢复 ...

  4. 在html页面实时显示系统时间

    在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可 <html> <head><meta http-equ ...

  5. 系统学习Python——进度条模块tqdm

    分类目录:<系统学习Python>总目录 tqdm在阿拉伯语中是"进步"的意思(塔卡杜姆,تقدّم)并且是西班牙语中"我非常爱你"的缩写.在Pyt ...

  6. html+显示在线时间,在html页面实时显示系统时间

    原创散场前的温柔 最后发布于2018-11-05 13:24:58 阅读数 16005  收藏 展开 在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存, ...

  7. java 歌词颜色变色_Axure教程:音乐播放器中,带时间的进度条/歌词颜色变化/旋转元件...

    原标题:Axure教程:音乐播放器中,带时间的进度条/歌词颜色变化/旋转元件 本文以QQ音乐为例,实现了带时间的进度条.歌词颜色变化.唱片旋转.暂停播放等原型交互. 一.效果展示 体验地址:https ...

  8. 以可读写可追加的方式显示系统时间

    以可读可写可追加的方式显示系统时间,并且第二次执行记录下了第一次的行号,紧接着第一次的行号执行显示系统时间. #include <time.h> #include <stdio.h& ...

  9. 【响应式Web前端设计】在html页面实时显示系统时间

    在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可 <html> <head><meta http-equ ...

最新文章

  1. java ui调试_如何使用 IBM i System Debugger 调试 Java 程序
  2. Oracle 中文分词CHINESE_VGRAM_LEXER与CHINESE_LEXER比较
  3. matlab bad apple,【bad apple】matlab制作矩阵苹果~
  4. sklearn 特征降维利器 —— PCA TSNE
  5. 动手动脑(Java)
  6. vgremore 删除卷组
  7. (渝粤教育)网络教育远程教育统考计算机应用基础复习题
  8. 如何使用Python提取pdf表格及文本,并保存到excel
  9. 《Evolutionary Computation for Expensive Optimization:A Survey》笔记
  10. 一些EXCHANGE命令
  11. 关于微信第三方平台$APPID$.wx.abc.com的问题
  12. Azure IoT Edge入门(2)部署一台Edge Device
  13. android 谷歌定位demo,android实现定位与目的地的导航示例代码
  14. 安卓10侧边返回_安卓10.0内测版现新操作手势:取消返回键、全靠Home胶囊完成...
  15. 《恋上数据结构与算法》第1季:算法概述
  16. 有趣的灵魂用有趣的屏保SadMac.saver
  17. 5G标准必要专利最新全球排名
  18. 硬盘分区MBR和GPT选哪个好?原来分个区还有这么多讲究!
  19. .NET5.0 初始
  20. 数字化生存时代的变与不变

热门文章

  1. pat 乙级 1021 个位数统计(C++)
  2. 光端机与交换机有什么区别?
  3. 【渝粤教育】广东开放大学 javaweb 动态网站开发技术 形成性考核 (53)
  4. 【渝粤题库】国家开放大学2021春3620矿井火灾防治题目
  5. 【教程】E103-W10无线串口服务器TCP协议与PC连接收发数据详解!
  6. Wi-Fi和WLAN有什么区别
  7. rpm mysql 更改目录_rpm形式安装的MySQL服务 并 修改数据文件目录( red hat)_mysql...
  8. ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南
  9. php入门速成(2),PHP入门速成(1)
  10. ASCII码表(全)