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

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

显示系统时间

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

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

 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_TIMERindicators数组中从0开始的序号。

//设置状态栏宽度

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

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

添加进度条:

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

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用保险柜管理机密

您如何存储秘密? 密码,API密钥,安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置,不得以纯文本格式提供。 实际上,不得在任何位置以明文形式存储它。 可以使用Spring Cloud Config Server或…

winScp中文乱码设置

打开一个putty窗口(图一),左上角鼠标左键点击,弹出设置界面,选择Change Settings,在图二界面的window->translation,Remote character set选择UTF-8,Apply应用即可。 转载于:https://www.cnblogs.com/ya…

键盘布局的改进之道

原文地址:http://www.cppblog.com/huaxiazhihuo/archive/2013/06/29/201380.html好久没上博客了,自己的那么一点微末道行也不敢拿出来丢人现眼。实际上,过去的几年,真的是让C和MFC害惨了,一直自个儿固步自封&#xff0…

如何将二维数组作为函数的参数传递

如何将二维数组作为函数的参数传递声明:如果你是得道的大侠,这篇文章可能浪费你的时间,如果你坚持要看,我当然感觉很高兴,但是希望你看完了别骂我!如果你发现我这篇文章有错误的话,你可以提出批…

鼠标爱心显示

/**爱心start**/(function(window,document,undefined){var hearts [];window.requestAnimationFrame (function(){return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window…

多台电脑共用一个耳机、音箱

台式机电脑声卡一般有三个插孔,一个是麦克风,一个是耳机,另一个就是LineIn输入口了,买一根AUX线,一头插入笔记本的耳机插口,另一头插入台式机linein口;在控制面板的声音中选择线路输入&#xff…

liferay开发文档_Liferay –简单主题开发

liferay开发文档实际上,Liferay的6.1版本已经走了很长一段路,该版本完全支持JSF和IceFaces。 我一直在努力学习它的绳索,因为我希望使其成为我们团队中的标准协作工具。 好的软件应用程序可以解决问题,但是好的软件应用程序不仅可…

ACRush 楼天城回忆录

利用假期空闲之时,将这几年 GCJ , ACM , TopCoder 参加的一些重要比赛作个回顾。首先是 GCJ2006 的回忆。 Google Code Jam 2006 一波三折: Google Code Jam 2006 是我第一次到美国参加现场的程序设计比赛。 Google Code Jam 2006…

Matlab计时函数

1. cputime 显示Matlab启动后所占用的CPU时间;eg: t0 cputime; 你的程序;timecputime-t0;2. tic,toc 秒表计时,tic是开始,toc是结束;eg: tic; 你的程序;toc;3. clock,etime 前者显示…

列表,字典表达式以及三元表达式

1.三元表达式条件成立时的返回值 if 条件 else 条件不成立时的返回值三元表达式的意义就是让一些简单的if判断写成一行,减少代码量def max2(x,y): if x > y: return x else: return yx10y20res x if x > y else yprint(res)2.列表生成式…

JUnit 5 –条件

最近,我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧! 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列中有关JUnit 5…

我的编程竞赛之路 ——中国大学生计算机编程第一人楼天城访谈

记者/陈秋歌 25岁的楼天城有“中国大学生计算机编程第一人”的称号,也被参加竞赛的学子们敬称为“楼教主”。他的传奇经历一直激励着众多年轻学子:从2001年开始参加计算机编程竞赛,并连获全国一等奖;2004年入选国家集训队&#xf…

MATLAB集合运算

intersect求两个集合的交集ismember检测集合中的元素setdiff求两个集合的差setxor求两个集合交集的非(异或)union求两个集合的并集unique取集合的单值元素注:交并等操作会对操作结果进行排序

IE8兼容性问题的解决方案

前几天,面试到Ie8的一些兼容问题,傻眼了,回想自己做了将近2年的移动端项目,ie兼容似乎没怎么做过。所以私下便开始找找ie兼容的视频或者文章学习,唉,还是不买书了,家里那么多书,都没…

jenkins部署_Jenkins:部署JEE工件

jenkins部署随着持续集成和持续交付的出现 ,我们的构建被分为不同的步骤,以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试,运行慢速测试,运行自动验收测试或发布应用程序等。 部署流程的最后步骤意味着将我们…

2013年3月编程语言排行榜:有毒的Java

2013年3月12日,Tiobe公布了新一期编程语言排行榜。Java依旧是占据第一的位置,C语言紧随其后。值得注意的Objective-C持续发力,已经占到了第三的位置。咋一看榜单,前5条中C#下滑最快,从第3名下降到第五名。而其他语言都…

MATLAB各种判断

1. isempty();%判断是否为空2. isnan();%判断是否为NaN3. iscell();%判断是否为元胞数组4. ischar();%判断是否为字符数组5. ismatrix();%判断是否为矩阵6. isrow();%Determine whether input is row vector7. ismember();

js 自定义类Android吐司提示框

(function(){var mouseX 0;var mouseY 0;//定义一个全局toaslist用来存在新建的吐司var toastLsit [];window.Toast function(content,duration,positon){return new Toast(content,duration,positon);}function Toast(content,duration,positon){//显示的内容this.content…

学习Lucene

我目前正在与一个团队合作,开始一个基于Lucene的新项目。 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene,但这是一个有意识的决定。 在这篇文章中,我正在整理一些学习Lucene的资源–希望您对他们有所帮助,或…

MATLAB递归程序的调试方法

MATLAB具有和VC类似的调试功能,各功能的按钮图标和VC也很相似,基本可以使用VC的调试思想。MATLAB自己的特点:一. 查看中间变量。1. 在调试状态下,鼠标放在变量上就可以显示变量的基本信息。2. 在调试状态下,在命令行输…