最近在公司做一個MFC項目,因為是MFC新手,所以在這里記錄一些最近用到和學到的東西留着以后查閱。
今天遇到的一個問題是要在窗口剛剛初始化完成時自動檢測一個配置文件是否存在(實際上就是檢測是不是首次登陸,首次登陸時創建這個配置文件),如果不存在就彈出MessageBox提醒用戶完成配置。檢測配置文件是否存在非常容易實現,直接使用CFileFind類的FindFile函數確定文件是否存在。困難的是如何在窗口初始化完成時自動彈出提示框。我首先想到的是將彈出提示框的功能加在主窗口的OnInitDialog函數中,但結果是提示框確實自動彈出了,但主窗口並沒有顯示,只有在提示框關閉后才顯示主窗口,這並不是我想要的結果。在網上問了問后發現可以使用SetTimer和OnTimer實現我想要的效果。
SetTimer函數簡單說就是一個定時器函數,可以創建一個定時器並指定間隔時長TLen和回調函數,回調函數默認就是OnTimer函數。實現的效果是每隔TLen時間就產生一個消息調用一次OnTimer函數。在網上有很多關於SetTimer的使用方法的介紹,我照着他們介紹的方法完成代碼后發現並沒有按照預期調用OnTimer函數,之后又找了很多資料,有一個提到之所以沒有實現調用OnTimer的功能是因為沒有加上時間ON_WM_TIMER()消息。加上之后就正確了。下面是我代碼
1 BEGIN_MESSAGE_MAP(Server_Info, CDialog) 2 ON_WM_TIMER() 3 END_MESSAGE_MAP() 4 5 BOOL Server_Info::OnInitDialog() 6 { 7 CDialog::OnInitDialog(); 8 9 SetTimer(1,500,NULL);//500ms定時消息,調用OnTimer。完成首次登陸路徑設置的通知任務 10 11 return TRUE; 12 } 13 14 // Server_Info 消息處理程序 15 16 void Server_Info::OnTimer(UINT_PTR nIDEvent) 17 { 18 KillTimer(1); 19 if(TRUE != isFirstLogin) 20 { 21 MessageBox(TEXT("首次登陸需要選擇測試報告路徑!"), TEXT("通知"), MB_ICONINFORMATION); 22 } 23 CDialog::OnTimer(nIDEvent); 24 }
另外就是關於KillTimer函數的使用。在用SetTimer創建一個定時器后,如果不再需要這個定時器,可以直接使用KillTimer函數將他關閉。KillTimer函數只有一個參數對應於要關閉定時器的ID,也就是在使用SetTimer函數創建定時器時的第一個參數。因為我的需求是只需要在登陸后提醒一次就可以,所以在調用OnTimer函數后直接將這個定時器關掉,實現提醒一次的功能。