显示系统时间

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默认产生的。

 

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

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

    原文地址:http://welkangm.blog.163.com/blog/static/19065851020127941446182/ 显示系统时间 1. 在状态栏中设置两个新的栏位Timer和 ...

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

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

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

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

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

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

  5. C语言显示系统时间的几个办法

    C语言显示系统时间的几个办法#include <time.h> #include <stdio.h> #include<stdlib.h>int main() {t ...

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

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

  7. php显示时间秒针走,Android_TextView显示系统时间(时钟功能带秒针变化,我们开启一个线程,线程每隔 - phpStudy...

    TextView显示系统时间(时钟功能带秒针变化 我们开启一个线程,线程每隔一秒发送一次消息,我们在消息中更新TextView上显示的时间就ok了. 首先我们在布局文件中放一个TextView用来显示 ...

  8. QT QTimer定时器显示系统时间倒计时功能

    QT定时器显示系统时间倒计时功能 lcdNumber控件显示 QTimer::singleShot(10000,this,&MainWindow6_6::close);//10秒后窗口自动关闭 ...

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

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

最新文章

  1. [开发笔记]-jQuery获取radio选中项的值
  2. jenkins自动化工具使用教程(转)
  3. Sql2008发送Email
  4. win10电脑pppoe拨号模块损坏_电脑维修免费在线咨询
  5. 数据库 10 大常见安全问题盘点~
  6. 梯度下降法优化目标函数_如何通过3个简单的步骤区分梯度下降目标函数
  7. mini车f和r的区别_最大最实用的MINI,最值得买的MINI?
  8. 杭电1231最大连续子序列
  9. Android自定义View初步
  10. Cocos2dx游戏源码合集
  11. spring、mybatis、测试用例执行后数据没有入库
  12. ICP算法(Iterative Closest Point迭代最近点算法)
  13. vc++ 6.0 三次bezier曲线绘制_Python matplotlib绘制散点图
  14. android api (82) —— InputConnection [输入法]
  15. HTML超好看的个人主页源码+支持响应式
  16. vue可以配合jade以及sass吗_在vue中如何使用Jade模板 - echart
  17. DNS域名管理系统与LAMP编译安装
  18. 《愤怒的小鸟大电影》分析报告
  19. 2019年六项扣除 个税计算器
  20. Qt报错Parse error at “IID“的解决办法

热门文章

  1. python的if语句例句_Python入门之if条件语句
  2. java按钮改变窗口大小_布局似乎有问题,JButton在调整窗口大小时显示出意外的行为。...
  3. pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例
  4. mysql小计_使用SQL实现小计,合计以及排序_MySQL
  5. 工业路由器和工业交换机的区别介绍
  6. 光端机安装调试需注意的几大因素
  7. 【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)
  8. 【渝粤教育】广东开放大学 企业项目报表分析 形成性考核 (35)
  9. 全境封锁服务器维护 2018,全境封锁全域事件2018年8月活动什么时候开始_全域事件怎么玩...
  10. Windows编程之网络之邮件槽通讯