想每隔一段時間執行一件事的的時候,你能夠使用它windows
SetTimer 構造函數:函數
UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定時器ID,多個定時器時,能夠經過該ID判斷是哪一個定時器 UINT nElapse, // 時間間隔,單位爲毫秒 TIMERPROC lpTimerFunc // 回調函數);
返回值:1. 函數成功,第一個參數參數爲0,則返回新創建的時鐘編號,能夠把這個時鐘編號傳遞給KillTimer來銷燬時鐘. 2. 函數成功,hWnd參數爲非0,則返回一個非零的整數,能夠把這個非零的整數傳遞給KillTimer來銷燬時鐘. 3. 函數失敗,返回值是零.若想得到更多的錯誤信息,調用GetLastError函數.spa
在MFC程序中SetTimer被封裝在CWnd類中,調用就不用指定窗口句柄了。因而SetTimer函數的原型變爲:code
UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))
高亮一個線路或者設備,爲了使它看起來明顯,能夠用倆種顏色變換閃爍。對象
.h裏面 //使當前顯示對象閃爍 afx_msg void OnTimer(UINT_PTR nIDEvent); cpp裏面 1.綁定事件響應 ON_WM_TIMER() 2.對話框初始化函數 BOOL CXXXDlg::OnInitDialog() { __super::OnInitDialog(); m_uTimer = SetTimer(1,1000,NULL); return TRUE; } 3.事件響應 void CXXXDlg::OnTimer(UINT_PTR nIDEvent) { CQKQuery mQky(m_pDataBase); mQky.LockDoc(); std::map<AcDbObjectId, int>::iterator iter = m_mapOrignColor.begin(); for (; iter != m_mapOrignColor.end(); ++iter) { AcDbObjectId ObjectId = iter->first; if (ObjectId.isNull() || !ObjectId.isValid()) continue; int nCurOrignColor = -1; mQky.GetObjectColorI(ObjectId, nCurOrignColor); //設置爲反色 mQky.SetObjectColorI(ObjectId, getReverseColorIndex(nCurOrignColor)); } mQky.UnLockDoc(); } //----------------------------------------------------------------------------------- // 函 數 名:GetObjectColorI // 函數介紹:設置實體顏色 // 參數介紹:const AcDbObjectId& mId // int& nColorIndex // 返 回 值:bool true:成功,false:失敗 //----------------------------------------------------------------------------------- bool CQKQuery::GetObjectColorI(const AcDbObjectId& mId, int& nColorIndex) { AcDbEntity *pEnt = NULL; HHVerifyErr2(acdbOpenObject(pEnt, mId, AcDb::kForWrite), return false;); nColorIndex = pEnt->colorIndex(); HHVerifyErr(pEnt->close()); return true; } //----------------------------------------------------------------------------------- // 函 數 名:SetObjectColorI // 函數介紹:設置某ID的顏色 // 參數介紹:const AcDbObjectId& mId object id // int nColorIndex 顏色序號 // 返 回 值:bool //----------------------------------------------------------------------------------- bool CQKQuery::SetObjectColorI(const AcDbObjectId& mId, int nColorIndex) { AcDbEntity *pEnt = NULL; HHVerifyErr2(acdbOpenObject(pEnt, mId, AcDb::kForWrite), return false;); HHVerify(SetObjectColorIP(pEnt, nColorIndex)); HHVerifyErr(pEnt->close()); return true; } //! 獲取反色索引值 int CXXXGlg::getReverseColorIndex(int nOrgIndex) { //當原色爲白時,直接返回紅 if (256 == nOrgIndex) return 1; CAcUiColorComboBox acColor; // 獲取原始索引值的RGB值 if (nOrgIndex == 0 || nOrgIndex == 255) nOrgIndex = 1; COLORREF dwOld = acColor.GetColorFromIndex(nOrgIndex); COLORREF dwReverse = dwOld ^ RGB(255,255,255); // RGB轉顏色索引值 int nReverseIndex = acColor.GetColorIndex(dwReverse); COLORREF dwOld1 = acColor.GetColorFromIndex(nReverseIndex); if (nReverseIndex == 0) nReverseIndex = nOrgIndex/2; return nReverseIndex; }
SetTimer 使用的是時間中斷響應計時,windows的時間中斷每1/18秒觸發一次,因此Timer最低精度約在55ms,低於這個時間則精度不夠。 從啓動系統開始,經歷的時間。單位爲毫秒。最大值約爲49.7天,若系統連續運行超過49.7天,dwTime的值會回到0從新開始計算。索引
有時可能達不到精準度,這時能夠使用timeSetEvent。事件