MFC_定时器

想每隔一段时间执行一件事的的时候,你可以使用它

SetTimer 构造函数:

UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数);

返回值:1. 函数成功,第一个参数参数为0,则返回新建立的时钟编号,可以把这个时钟编号传递给KillTimer来销毁时钟. 2. 函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟. 3. 函数失败,返回值是零.若想获得更多的错误信息,调用GetLastError函数.

在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了。于是SetTimer函数的原型变为:

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。

 

转载于:https://my.oschina.net/u/2930533/blog/1791718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值