MFC状态栏编程(显示系统时间和进度条)
显示系统时间
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状态栏编程(显示系统时间和进度条)相关推荐
- 状态栏编程(显示系统时间和进度条)
原文地址:http://welkangm.blog.163.com/blog/static/19065851020127941446182/ 显示系统时间 1. 在状态栏中设置两个新的栏位Timer和 ...
- 【MFC】显示系统时间的状态栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 状态栏主要用于显示程序 ...
- 以可读写可追加的方式显示系统时间
以可读可写可追加的方式显示系统时间,并且第二次执行记录下了第一次的行号,紧接着第一次的行号执行显示系统时间. #include <time.h> #include <stdio.h& ...
- 【响应式Web前端设计】在html页面实时显示系统时间
在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可 <html> <head><meta http-equ ...
- C语言显示系统时间的几个办法
C语言显示系统时间的几个办法#include <time.h> #include <stdio.h> #include<stdlib.h>int main() {t ...
- 在html页面实时显示系统时间
在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可 <html> <head><meta http-equ ...
- php显示时间秒针走,Android_TextView显示系统时间(时钟功能带秒针变化,我们开启一个线程,线程每隔 - phpStudy...
TextView显示系统时间(时钟功能带秒针变化 我们开启一个线程,线程每隔一秒发送一次消息,我们在消息中更新TextView上显示的时间就ok了. 首先我们在布局文件中放一个TextView用来显示 ...
- QT QTimer定时器显示系统时间倒计时功能
QT定时器显示系统时间倒计时功能 lcdNumber控件显示 QTimer::singleShot(10000,this,&MainWindow6_6::close);//10秒后窗口自动关闭 ...
- html+显示在线时间,在html页面实时显示系统时间
原创散场前的温柔 最后发布于2018-11-05 13:24:58 阅读数 16005 收藏 展开 在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存, ...
最新文章
- [开发笔记]-jQuery获取radio选中项的值
- jenkins自动化工具使用教程(转)
- Sql2008发送Email
- win10电脑pppoe拨号模块损坏_电脑维修免费在线咨询
- 数据库 10 大常见安全问题盘点~
- 梯度下降法优化目标函数_如何通过3个简单的步骤区分梯度下降目标函数
- mini车f和r的区别_最大最实用的MINI,最值得买的MINI?
- 杭电1231最大连续子序列
- Android自定义View初步
- Cocos2dx游戏源码合集
- spring、mybatis、测试用例执行后数据没有入库
- ICP算法(Iterative Closest Point迭代最近点算法)
- vc++ 6.0 三次bezier曲线绘制_Python matplotlib绘制散点图
- android api (82) —— InputConnection [输入法]
- HTML超好看的个人主页源码+支持响应式
- vue可以配合jade以及sass吗_在vue中如何使用Jade模板 - echart
- DNS域名管理系统与LAMP编译安装
- 《愤怒的小鸟大电影》分析报告
- 2019年六项扣除 个税计算器
- Qt报错Parse error at “IID“的解决办法
热门文章
- python的if语句例句_Python入门之if条件语句
- java按钮改变窗口大小_布局似乎有问题,JButton在调整窗口大小时显示出意外的行为。...
- pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例
- mysql小计_使用SQL实现小计,合计以及排序_MySQL
- 工业路由器和工业交换机的区别介绍
- 光端机安装调试需注意的几大因素
- 【渝粤题库】陕西师范大学210002儿童文学 作业(高起专、高起本、专升本)
- 【渝粤教育】广东开放大学 企业项目报表分析 形成性考核 (35)
- 全境封锁服务器维护 2018,全境封锁全域事件2018年8月活动什么时候开始_全域事件怎么玩...
- Windows编程之网络之邮件槽通讯