精华内容
下载资源
问答
  • MFC 使用定时器的示例. 1,选择Dialog视图,右击选择“事件”. 2,选择“新建Windows消息/事件(N)”列表,添加WM_TIMER到右侧列表内。 3,cpp会自动生成 void CMFC_Timer****::OnTimer(UINT nIDEvent);...
  • MFC——SetTimer函数的用法

    千次阅读 2017-11-21 09:33:15
    什么时候我们需要用到SetTimer函数呢?当你需要每隔一段时间执行一件事的的时候就需要使用SetTimer函数了。使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。...

      什么时候我们需要用到SetTimer函数呢?当你需要每隔一段时间执行一件事的的时候就需要使用SetTimer函数


    了。使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通


    常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
      
    1.1 用WM_TIMER来设置定时器 


      先请看SetTimer这个API函数的原型  


    UINT_PTR SetTimer(


      HWND hWnd,          // 窗口句柄


      UINT_PTR nIDEvent,      // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器


      UINT uElapse,         // 时间间隔,单位为毫秒


      TIMERPROC lpTimerFunc     // 回调函数


    );


    例如  


    SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器


    在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了


    于是SetTimer函数的原型变为: 
     
    UINT SetTimer(


      UINT nIDEvent,


      UINT nElapse,


      void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)


    )  


      当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字,


    nElapse指的是时间间隔 ,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数 ,在这个函数里,


    放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是onTime函


    数。 这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器


    的类,添加WM_TIME消息映射,就自动生成onTime函数了 。然后在函数里添加代码,让代码实现功能。每隔一段


    时间就会自动执行一次。  


    例:  


    SetTimer(1,1000,NULL); 
     
    1:计时器的标识; 


    1000:时间间隔,单位是毫秒; 
     
    NULL:使用onTime函数。 
     
    当不需要计时器的时候调用KillTimer(nIDEvent); 
      
    例如:KillTimer(1); 
     
    1.2 调用回调函数 


      此方法首先写一个如下格式的回调函数(在SetTimer函数表示回调函数TIMERPROC不为空时,需要调用自定义的


    回调函数 ) 


    void CALLBACK TimerProc(


      HWND hWnd,


      UINT uMsg,


      UINT idEvent,


      DWORD dwTime


    );


    然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。


    如果要加入两个或者两个以上的timer怎么办?   


    继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。 
     
    SetTimer(2,1000,NULL);  


    SetTimer(3,500,NULL);  


    嗯,WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码: 

     
    onTimer(nIDEvent)  


    {  


      switch(nIDEvent)  


      {  


       case 1:..;  


           break; 

     
       case 2:..;  


           break; 

     
       case 3:..;  


           break;  


      

     

    }
     
       在使用定时器时注意SetTimer中表示定义时标识的nIDEvent参数,以及OnTimer或自定义的回调函数中


    nIDEvent参数,还有KillTimer中的这个参数,如果要用它们对特定的定时器进行操作时,注意保持它们的一致。

    展开全文
  • 刚学MFC,想做一个倒计时器,下面为部分代码,ToSecond和ToTimeFormat 是秒和时间字符串的转换。大神们知道问题出在哪里吗? void CTimerDlg::OnBnClickedBegin() ... // TODO: 在此添加控件通知处理程序...
  • MFC中的SetTimer的使用

    千次阅读 2018-04-18 18:00:44
    这里对于SetTimer()函数原型的定义我就不啰嗦,直接上网查。我直接贴出代码和结果。 1、首先在OnInitDialog()中添加如下代码: // TODO: 在此添加额外的初始化代码 CTime m_time; m_time = CTime::...

    这里对于SetTimer()函数原型的定义我就不啰嗦,直接上网查。我直接贴出代码和结果。

    1、首先在OnInitDialog()中添加如下代码:

    // TODO: 在此添加额外的初始化代码
    	CTime m_time;
    	m_time = CTime::GetCurrentTime();
    
    	CString m_strDate;
    	CString m_strTime;
    
    	m_strDate = m_time.Format(_T("%x"));//格式化日期
    	m_strTime = m_time.Format(_T("%X"));//格式化时间
    
    	CString m_strDateTime;
    	m_strDateTime = m_time.Format(/*_T*/("%Y-%m-%d %H:%M:%S %A"));	//格式化日期时间
    	UpdateData(FALSE);
    
    	//GetDlgItem(IDC_STATIC_CURR_TIME)->SetWindowText(m_strDateTime);
    	SetDlgItemText(IDC_EDIT_TIME, m_strDateTime);
    	//启动定时器
    	SetTimer(1, 1000, NULL);

    2、然后添加定时器的WM_TIMER消息处理函数,并添加代码:
    void CTest1Dlg::OnTimer(UINT_PTR nIDEvent)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	
    	if (1 == nIDEvent)
    	{
    		CString strTime;
    		CTime tm;
    		tm = CTime::GetCurrentTime();
    		strTime = tm.Format("%Y-%m-%d %H:%M:%S %A");
    		SetDlgItemText(IDC_EDIT_TIME, strTime);	//显示系统时间
    	}
    	
    
    	CDialog::OnTimer(nIDEvent);
    }
    运行结果如下:


    展开全文
  • 用了半年的settimer,愚以为这个定时器真是方便好用,与多线程相比优势明显,不禁怀疑为什么多线程还有存在的意义。 直到今天使用定时器播放视频,问题出来了,定时器播放视频与普通的媒体播放视频相比,播放...

    用了半年的settimer,愚以为这个定时器真是方便好用,与多线程相比优势明显,不禁怀疑为什么多线程还有存在的意义。


    直到今天使用定时器播放视频,问题出来了,定时器播放视频与普通的媒体播放视频相比,播放速度总是很慢,而且精度不仅不能保证,误差相当大,有时候,我播放30秒的视频,在Ontimer中执行40多秒才播放完,这是不能容忍的。


    顿时发觉ontimer在处理这种对时间精度要求很高的程序中,没有任何优势了,所以只能另开线程,执行播放视频的功能。


    在mfc中,使用

    CWinThread*m_pThread2PlayVideo = AfxBeginThread(Thread2PlayVideo,this);
    其中,Thread2PlayVideo是播放视频的线程函数,而this是线程函数所在类的指针。为什么需要传入类的指针这个参数呢,因为类中的线程函数必须为静态函数(static),而类的静态函数如果想访问非静态成员变量的话是无法直接实现的,必须间接达到目的。


    下面是执行的代码:


    UINT CxxView::Thread2PlayVideo(LPVOID pParam)
    {
    	CxxView*pView = (CxxView*)pParam;
    	CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
    	pView->m_hWndStatic = pMain->m_wndNativeView.m_wndDrawContent.m_oPictureCtrlNativeViedo.GetSafeHwnd();
    	pView->m_pWndStatic = FromHandle(pView->m_hWndStatic);
    	pView->m_pWndStatic->GetClientRect(&pView->m_oRect);
    	static int s_nC = 0;
    	if (pView->m_oOperativeparamsWnd.getplaybackparams()->m_strVideoPath!="")
    	{
    		pView->m_PlayBackCapture = cvCreateFileCapture(pView->m_oOperativeparamsWnd.getplaybackparams()->m_strVideoPath);
    		int numFrames = (int) cvGetCaptureProperty(pView->m_PlayBackCapture, CV_CAP_PROP_FRAME_COUNT);
    		pView->m_PlayBackFrame = cvQueryFrame(pView->m_PlayBackCapture);
    	}
    
    	if (pView->m_PlayBackCapture==NULL || pView->m_PlayBackFrame==NULL)
    	{
    		return 0;
    	}
    
    	
    <strong>	while (pView->m_PlayBackCapture)
    	{
    		long lt1 = GetTickCount();
    		s_nC++;
    		if (s_nC*15.0/1000.0>125.0 && (s_nC-1)*15.0/1000.0<125.0)
    		{
    			pView->SetTimer(3,pView->m_nElapse,NULL);
    		}
    		pView->m_PlayBackFrame = cvQueryFrame(pView->m_PlayBackCapture);
    		drawIplmageOnMFC(pView->m_PlayBackFrame,pView->m_oRect,pView->m_hWndStatic,pView->m_pWndStatic->GetDC(),1);
    		long lt2 = GetTickCount();
    		long a = lt2-lt1;
    		Sleep(1000.0/15.0-a);
    	}</strong>
    	
    
    	return 0;
    
    }
    加粗的代码为主要的实现方式,可以通过实时调节sleep()时间来达到精确播放视频的目的。

    展开全文
  • MFC之SetTimer的使用

    千次阅读 2013-08-27 11:36:41
    首先在这里说一下,我使用的环境是VS2005。先说一下步骤,然后贴出代码。 步骤1:建立基于Dialog的MFC工程; 步骤2:在对话框上添加两个静态框,分别为“1秒中刷新一次”和“2秒刷新一次” 。...

    首先在这里说一下,我使用的环境是VS2005。先说一下步骤,然后贴出代码。

    步骤1:建立基于Dialog的MFC工程;

    步骤2:在对话框上添加两个静态框,分别为“1秒中刷新一次”和“2秒刷新一次” 。两个编辑框,分别为“IDC_EDIT1”和"IDC_EDIT2",默认情况下就是这样的。然后在对应的对话框类中添加两个成员变量:

    m_nData1 和 m_nData2

    然后把编辑框的ReadOnly都改为TRUE 。

    步骤3:点击OK按钮,在其中添加代码,如下:

    void CMFCTimerDlg::OnBnClickedOk()
    {
    	// TODO: Add your control notification handler code here
    	SetTimer(1, 2000, NULL) ;
    	SetTimer(2, 1000, NULL) ;
    	//OnOK();
    }
    步骤4:对话框类添加WM_TIME消息。代码如下:

    void CMFCTimerDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	// TODO: Add your message handler code here and/or call default
    	switch(nIDEvent)
    	{	
    	case 1:
    		if (5 == m_nData1)
    		{
    			KillTimer(1) ;
    			break ;
    		}
    		SetDlgItemInt(IDC_EDIT1, ++m_nData1) ;
    	case 2:
    		if (10 == m_nData2)
    		{
    			KillTimer(2) ;
    			break ;
    		}
    		SetDlgItemInt(IDC_EDIT2, ++m_nData2) ;
    	default:
    		break ;
    	}
    	CDialog::OnTimer(nIDEvent);
    }
    运行结果如下:


    展开全文
  • MFC定时器SetTimer函数用法总结

    万次阅读 多人点赞 2014-11-15 10:24:10
    CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。 1、启动定时器。  启动定时器就需要使用CWnd类的成员函数SetTimer。CWnd::SetTimer的原型如下...
  • MFC界面刷新方法总结

    千次阅读 2013-03-11 18:15:01
    UpdateData(FALSE);用于主线程 UpdateData(TRUE); InvalidateRect(NULL,FALSE); InvalidateRect(NULL,TRUE); PostMessage(WM_PAINT); SendMessage(WM_PAINT,0,0);...//这个也很给力

空空如也

空空如也

1
收藏数 8
精华内容 3
关键字:

mfcsettimer