MFC_定時器

想每隔一段時間執行一件事的的時候,你能夠使用它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。事件

相關文章
相關標籤/搜索