求大神!!如何在MFC中设置一个计时器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求大神!!如何在MFC中设置一个计时器?相关的知识,希望对你有一定的参考价值。

我现在需要做一个计时器,是鼠标点击第一下开始计时,点击到第五下结束计时并显示时间。菜鸟一只,拜托各路大神帮帮我~!! 讲详细一点 做出来后我还会加分!!!

定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期性的自动操作。例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为1个小时,那么每隔1个小时系统就会采集一次数据,这样就可以在无人操作的情况下准确的进行操作。
MFC定时器
VS2010编程中,我们可以使用MFC的CWnd类提供的成员函数SetTimer实现定时器功能,也可以使用Windows API函数SetTimer来实现。两者使用方法实际上很类似,但也有不同。
CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。因为本教程主要是讲解MFC编程,所以这里就先重点讲解MFC定时器的用法,关于API函数SetTimer的用法鸡啄米会在MFC定时器讲解的基础上进行延伸。
启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下:
UINT_PTR SetTimer(
UINT_PTR nIDEvent,
UINT nElapse,
void (CALLBACK* lpfnTimer
)(HWND,
UINT,
UINT_PTR,
DWORD
)
);
参数nIDEvent指定一个非零的定时器ID;参数nElapse指定间隔时间,单位为毫秒;参数lpfnTimer指定一个回调函数的地址,如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。如果此函数成功则返回一个新的定时器的ID,我们可以使用此ID通过KillTimer成员函数来销毁该定时器,如果函数失败则返回0。
通过SetTimer成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过WM_TIMER消息的消息响应函数,一种是通过回调函数。
如果要启动多个定时器就多次调用SetTimer成员函数。另外,在不同的CWnd中可以有ID相同的定时器,并不冲突。
2、为WM_TIMER消息添加消息处理函数,或者定义回调函数。
如果调用CWnd::SetTimer函数时最后一个参数为NULL,则通过WM_TIMER的消息处理函数来处理定时事件。添加WM_TIMER消息的处理函数的方法是,在VS2010工程的Class View类视图中找到要添加定时器的类,点击右键,选择Properties,显示其属性页,然后在属性页工具栏上点击Messages按钮,下面列表就列出了所有消息,找到WM_TIMER消息,添加消息处理函数。
参考技术A 很简单,按钮点击增加一个消息响应函数,这个函数中间设置一个static int型的变量(比如n),注意一定要是static 型。初始设置为0。按钮每点击一下时将这个变量+1,同时判断这个变量n,如果数据等于1,则取当时的时间,保存起来,你可以保存到另一个static变量或类的成员变量或者全局变量中;判断如果n==5,则取当时时间,与之前保存的时间作减法,算出来的时间差就是你要的。
怎么样,够详细了吧追问

谢谢回答! 可是如何使按钮每点击一下 变量加1?
C++只学了不到一年 MFC更是菜鸟级别.....

追答

在资源界面的按钮上双击,会弹出一个增加按钮的响应函数,进去函数里面,就按我上面的做。

本回答被提问者采纳

在 CFileDialog (MFC) 中设置文件夹视图

【中文标题】在 CFileDialog (MFC) 中设置文件夹视图【英文标题】:Setting the folder view in a CFileDialog (MFC) 【发布时间】:2011-10-25 08:02:35 【问题描述】:

是否有一种标准方法可以在 CFileDialog 中设置文件夹视图(启用 Vista 样式)?我正在尝试让它显示详细信息视图和一些自定义列。

我已经实现了一个 Windows 7 列处理程序,它显示由我的应用程序创建的文件的特定于应用程序的信息。但是,为了在资源管理器窗口或公用文件对话框中查看这些自定义列,我必须手动将文件夹视图设置为详细信息,然后选择我想要的特定列。

这很好用,但目标是让应用程序中的文件选择器自动在详细信息视图中显示这些列,除非用户更改视图样式。

我已经研究了各种方法来做到这一点,但没有找到可行的解决方案。 shell 属性包似乎存储了列类型和宽度以及视图样式,但其中大部分是二进制的,并且没有明显记录。如果我复制包属性,我可以切换视图设置,但这似乎很脆弱。

任何指针或其他帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我认为 Explorer 不会在 Vista/Windows 7 中加载列处理程序。

在 vista 文件对话框中更改视图设置:

Check OS version (needs Vista or higher)    
Not sure which event is raised on startup, OnFolderChange maybe?
assuming OnFolderChange is raised, override CFileDialog::OnFolderChange:
call GetIFileSaveDialog/GetIFileOpenDialog to get IFileDialog
//begin undocumented behavior 
QI for IServiceProvider from IFileDialog
QS for SID_SFolderView with IID_IFolderView2
call IFolderView2::SetViewModeAndIconSize
//end undocumented behavior
clean up COM interfaces

您也可以尝试未记录的方法 #2

//begin undocumented behavior 
QI for IServiceProvider from IFileDialog
QS for SID_STopLevelBrowser with IID_IShellBrowser
call IShellBrowser::QueryActiveShellView to get IShellView
QI IFolderView2 from IShellView
call IFolderView2::SetViewModeAndIconSize
//end undocumented behavior
clean up COM interfaces

【讨论】:

我称它为列处理程序,但它使用属性系统 COM 接口来处理显示自定义列和进入其中的数据。这在 Vista 和 7 中运行良好(在 XP 上,我需要实现之前的 IColumnProvider,但这是另一回事)。谢谢,我会调查这种方法。 我希望我有足够的业力来支持你。最终结果使用 IFileDialog -> IServiceProvider 中的 IFolderView2 将视图更改为详细信息模式。然后使用 IServiceProvider -> IShellBrowser -> IShellView 中的 IColumnManager 我能够使用我的自定义列的属性存储道具键设置列。非常感谢。

以上是关于求大神!!如何在MFC中设置一个计时器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ogre 3D 中设置计时器?

如何在 Java 中设置定时器?

如何在Excel中设置日期倒计时函数,不包含周六周日两天。

猎豹MFC--进度条CProgressCtrl 定时器SetTimer

我们可以在 -applicationWillTerminate 方法中设置一个计时器吗?

Firestore 限制每小时或每天的读写次数,以防止用户在检查器中设置计时器