日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

定时器:SetTimer

發布時間:2025/3/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定时器:SetTimer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


注:把編輯框屬性設置為“只讀”

什么時候我們需要用到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,這次可以是23,...。 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的button不可點擊 先設置button不可點擊, 再完成某些事件后變成可點擊,如何做? GetDlgItem(IDC_BUTTON)->EnableWindow(TRUE); // 可以點擊GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE); // 不可點擊

程序案例:

BOOL C定時器Dlg::OnInitDialog() //OnInitDialog初始化函數 {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標// TODO: 在此添加額外的初始化代碼GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); // 不可點擊return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }void C定時器Dlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);} }void C定時器Dlg::OnBnClickedButton1() //開始按鈕 {// TODO: 在此添加控件通知處理程序代碼SetTimer(1,1000,NULL);GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); // 不可點擊GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); // 不可點擊 }void C定時器Dlg::OnTimer(UINT_PTR nIDEvent) //添加的定時器OnTimer {// TODO: 在此添加消息處理程序代碼和/或調用默認值UpdateData(TRUE);m_value++;UpdateData(FALSE);CDialogEx::OnTimer(nIDEvent); }void C定時器Dlg::OnBnClickedButton2() //結束按鈕 {// TODO: 在此添加控件通知處理程序代碼KillTimer(1);m_value = 0;UpdateData(FALSE);GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); // 不可點擊GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); // 不可點擊 }

總結

以上是生活随笔為你收集整理的定时器:SetTimer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。