VC 对话框中 timer 控件使用

 在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。
使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。
然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。
响应方式如下:
  void   CTimeDlg::OnTimer(UINT   nIDEvent)    
  {  
                  if(nIDEvent==1000)//间隔为5秒  
                  {  
                            //处理事件  
                    }    
                    elseif(nIDEvent==1001)//间隔为10秒  
                  {  
                            //处理事件  
                    }    
   
  CDialog::OnTimer(nIDEvent);  
  }
以下是给出一个串口通信定时检查接收数据的部分代码

void CMyDlg::OnOpenCom() 
{
    
//  TODO: Add your control notification handler code here
    
if ( f_open_com == true  )
    {
        f_open_com 
=   false ;
        GetDlgItem(IDC_OPEN_COM)
-> SetWindowText( " 打开通信端口 " );
        CloseHandle(hComm);
        KillTimer(
1000 );    ///  关闭定时器
        return ;
    }
    SetTimer(
1000 1000 NULL );    /// nIDEvent == 1000 , time = 5000ms
    
const  char  * ComNo;
    DCB dcb;
    
string  temp( " COM1 " );
    ComNo 
=  temp.c_str();
    hComm 
=  CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE ,
        
0  ,  NULL  , OPEN_EXISTING ,  0  ,  0 );
    
if ( hComm == INVALID_HANDLE_VALUE )    ///  如果端口未打开
    {
        MessageBox(
" 打开通信端口出错! "  ,  " Comm Error "  , MB_OK);
        return ;
    }
    
///   将dcb地址传入,以取得通信参数
    GetCommState(hComm,
& dcb);       ///  得知目前通信状态
    dcb.BaudRate 
=  CBR_9600;
    dcb.ByteSize 
=   8 ;               ///  字节为8
    dcb.Parity 
=  NOPARITY;            ///  Parity为None
    dcb.StopBits 
=  ONESTOPBIT;        ///  1个停止位
    
if ( !SetCommState( hComm ,  & dcb)){
        MessageBox(
" 通信端口设置出错! "  ,  " Set Error "  , MB_OK );
        CloseHandle(hComm);
        return;
    }
    GetDlgItem(IDC_OPEN_COM)
-> SetWindowText( " 关闭通信端口 " );
    f_open_com 
=   true ;
}
void CMyDlg::OnTimer(UINT nIDEvent) 
{
    
//  TODO: Add your message handler code here  and / or   call  default
    char inbuff[
1024 ];
    DWORD nBytesRead , dwError;
    COMSTAT cs;
    
///    取得状态
    ClearCommError( hComm , 
& dwError ,  & cs);
    
///    数据是否大于所准备的缓冲区
    
if ( cs.cbInQue  >  sizeof(inbuff) )
    {
        PurgeComm(hComm , PURGE_RXCLEAR );   
///  清除通信端口数据
        return ;
    }
    ReadFile(hComm , inbuff , cs.cbInQue , 
& nBytesRead ,  NULL  );  // 接收通信端口的数据
    inbuff[cs.cbInQue] 
=   ' /0';
    MessageBox( " 打开通信端口出错! "  ,  " Comm Error "  , MB_OK);
    m_Receive.Format(
" %s " ,inbuff);
    UpdateData(
false );
    CDialog::OnTimer(nIDEvent);
}

http://www.cppblog.com/l-y-p/archive/2008/04/06/46340.html

你可能感兴趣的:(timer,null)