MFC定时器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MFC定时器在程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动。MFC提供了定时器来完成这个功能。=========================================================================在MFC中和定时器相关的有三个函数:UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));afx_msgvoidOnTimer(UINTnIDEvent);BOOLKillTimer(intnIDEvent);=========================================================================参数说明:UINTnIDEvent:定时器的ID,给定时器唯一的身份验证,如果在一个程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息。UINTnElapse:定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD):这个回调函数中实现刷新时所做的操作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。=========================================================================函数功能:SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才时定时程序大展宏图的地方。KillTimer用来结束一个定时器。下面我们用一个例子来说明定时器的使用:这个例子用来实现一个简单的功能,就是在一个单文档程序中,每间隔5秒弹出一个消息框提示“定时器1”,每隔7秒弹出一个消息框提示“定时器2”。建立单文档程序略,一路Next。=========================================================================(1)在resource.h中定义两个定时器的ID#defineIDTIMER11#defineIDTIMER22(2)在CMainFrame的OnCreate函数中定义两个定时器的属性。SetTimer(TIMEID1,5000,0);SetTimer(TIMEID2,7000,0);(3)CMainFrame中对WM_TIMER进行响应。oidCMainFrame::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultswitch(nIDEvent){caseTIMEID1:{AfxMessageBox(定时器1!);break;}caseTIMEID2:{AfxMessageBox(定时器2!);break;}default:;}CFrameWnd::OnTimer(nIDEvent);}(4)在CMainFrame的析构函数中添加KillTimer(IDTIMER1);KillTimer(IDTIMER2);==============================参考2当执行到程序的某一行代码时,需要添加计时器,就用这条语句:SetTimer(1,1000,NULL);参数如下:UINT_PTRSetTimer(UINT_PTRnIDEvent,UINTnElapse,void(CALLBACK*lpfnTimer)(HWND,UINT,UINT_PTR,DWORD));设置好后计时器立马生效,1秒后计时器发生中断,在代码所在的类中进行捕捉:1.在该类的消息中添加:BEGIN_MESSAGE_MAP(CTab1,CDialog)//CTab1是自己定义的一个类...ON_WM_TIMER()...END_MESSAGE_MAP()2.所在的类中添加成员函数:voidOnTimer(UINT_PTRnIDEvent);3.添加函数的代码,即捕捉后的执行代码:voidCTab1::OnTimer(UINT_PTRnIDEvent){switch(nIDEvent){case1://计时器1....//处理的代码KillTimer(1);//删除此计时器,否则计时器中断完后会自动重新开始计时,到下一次中断时还会发生新的中断break;case2://计时器2....//处理的代码break;default:MessageBox(default:KillTimer);KillTimer(nIDEvent);break;}}MFC定时触发器实现循环给指定线程进行发送消息//头文件#includeStdAfx.h#includeATPC.h#includeTWinApp.h#includeMainWindow.h#includeTWndAttrs.h#includeTWinThread.h//窗体拖动的宏的定义#defineSC_DRAGMOVE(0xf012)CMainWindow::CMainWindow(){}CMainWindow::~CMainWindow(void){m_wndAttrs.Destory();}//获得桌面的位置参数voidCMainWindow::GetWindowPos(RECT&_in_out_rect){::GetWindowRect(::GetDesktopWindow(),&_in_out_rect);LONGnWidth=_in_out_rect.right-_in_out_rect.left;LONGnHight=_in_out_rect.bottom-_in_out_rect.top;_in_out_rect.left=0;_in_out_rect.top=0;_in_out_rect.right=nWidth/4;_in_out_rect.bottom=nHight*2/3;}//创建主窗体BOOLCMainWindow::MainWindowInit(){m_pThread.CreateThread();//启动主线程通过拦截系统时间消息进行相关处理RECTrect={0};GetWindowPos(rect);//参数引用,获得参数值的传递LPTWINDOWPROPERTIESpWndProperty=m_wndAttrs.GetWindowProperty(CTWndAttrs::E_WND_ID_MAINWND);if(NULL==pWndProperty||false==CMainWindow::Create(pWndProperty-lpszClass,pWndProperty-lpszName,\pWndProperty-style,rect,NULL,\pWndProperty-lpszMenu,pWndProperty-dwExStyle,NULL))//构造函数直接进行窗口的创建{_tprintf(_T(CMainWindow::Createfalse\r\n));returnfalse;}this-SetTimer(0x11223344,2000,NULL);//触发一个定时器,每到这个时间段就会发送一个ON_WM_TIMER,然后拦截进行处理returntrue;}//创建自己的消息映射表(放在类的实现进行定义拦截消息的)BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)ON_WM_MOVE()ON_WM_CLOSE()ON_WM_TIMER()ON_WM_CREATE()ON_WM_CTLCOLOR()ON_WM_ERASEBKGND()ON_WM_SYSCOMMAND()//ON_MESSAGE(WM_USER_THREADEND,OnMyMess)//添加的消息映射//ON_COMMAND()END_MESSAGE_MAP()//处理单击关闭标题后的工作voidCMainWindow::OnClose(){::DestroyWindow(m_hWnd);//销毁活动的窗口(参数是获得当前活动窗口的句柄)ExitThread(0);}//在主窗体基础上进行控件的创建intCMainWindow::OnCreate(LPCREATESTRUCTlpcreatestruct){LPTWINDOWPROPERTIESpWndproperty=m_wndAttrs.GetWindowProperty(CTWndAttrs::E_WND_ID_LISTBOX);RECTrect={0};GetClientRect(&rect);if(NULL==pWndproperty||false==m_listbox.Create(pWndproperty-style,CRect(rect),this,pWndproperty-id)){returnfalse;}for(inti=0;i50;++i){m_listbox.AddString(_T(TESTTESTTESTTESTTESTTESTTESTTESTTEST));m_listbox.AddString(_T(山东科技大学));}returntrue;//returnCFrameWnd::OnCreate(lpcreatestruct);//并不是非要返回父类的成员函数OnCreate}//修改主窗体控件背景的颜色BOOLCMainWindow::OnEraseBkgnd(CDC*pDC){returnCFrameWnd::OnEraseBkgnd(pDC);}//设置控件的背景颜色和文本颜色HBRUSHCMainWindow::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){if(CTLCOLOR_LISTBOX==nCtlColor&&pWnd==&m_listbox){LPTWINDOWPROPERTIESpWndProperty=m_wndAttrs.GetWindowProperty(CTWndAttrs::E_WND_ID_LISTBOX);if(pWndProperty){pDC-SetTextColor(pWndProperty-colors[E_WND_COLOR_TEXT]);pDC-SetBkColor(pWndProperty-colors[E_WND_COLOR_BACKGROUND]);pDC-SetBkMode(OPAQUE);return::CreateSolidBrush(pWndProperty-colors[E_WND_COLOR_BACKGROUND]);}}returnCFrameWnd::OnCtlColor(pDC,pWnd,nCtlColor);//其实不返回父类,也可以成功创建窗口控件}//拦截系统消息WM_SYSCOMMAND进行处理窗体的移动禁止voidCMainWindow::OnSysCommand(UINTnID,LPARAMlParam){if(SC_DRAGMOVE!=nID){CFrameWnd::OnSysCommand(nID,lParam);}}//拦截系统时间消息进行处理voidCMainWindow::OnTimer(UINT_PTRnIDEvent){staticUINT_PTRevt=WM_USER+0;//用户信息的定义使用的是WM_USER+X(整数值)if(0x11223344==nIDEvent){this-KillTimer(0x11223344);BOOLret=:

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功