mfc中static控件显示时间闪烁
我使用mfc创建一个基于对话框的程序,上面有一个statictext控件,用于显示时间。在OnTimer中处理该控件的文本刷新,开始弄的时候有重叠,后来我在网上找了个方法...
我使用mfc创建一个基于对话框的程序,上面有一个static text控件,用于显示时间。
在OnTimer中处理该控件的文本刷新,开始弄的时候有重叠,后来我在网上找了个方法,就是获取其父窗口,通过父窗口来刷新其所在矩形区域,这样倒是没有重叠了,但是每隔一秒钟,该区域的时间便刷新一次,那么就闪烁一次。
有没有好的办法,既可以刷新文本内容,又没有闪烁?
谢谢!
我的对话框背景图是贴了一张bmp图片的
然后需要将static背景设置为透明,这个时候不做刷新处理的话,static文本会重叠
刷新就有闪烁。
1楼能给个具体点的实现步骤吗?
2楼的我试过,不行的。
3楼的明天试试。
再次补充:
3楼的我试过了,在OnTimer中调Invalidate(),不管里面传FALSE,TRUE,都是刷整个屏幕,其它好多控件都闪烁了。
另外,我的操作:在OnCtlColor()中,设置背景透明,pDC->SetBkMode(RANSPARENT);然后在OnTimer()中,重新写内容,然后调GetDlgItem(IDC_STC_DRAW)->GetParent->RedrawWindow(&rect);其中rect为static控件的区域。 展开
在OnTimer中处理该控件的文本刷新,开始弄的时候有重叠,后来我在网上找了个方法,就是获取其父窗口,通过父窗口来刷新其所在矩形区域,这样倒是没有重叠了,但是每隔一秒钟,该区域的时间便刷新一次,那么就闪烁一次。
有没有好的办法,既可以刷新文本内容,又没有闪烁?
谢谢!
我的对话框背景图是贴了一张bmp图片的
然后需要将static背景设置为透明,这个时候不做刷新处理的话,static文本会重叠
刷新就有闪烁。
1楼能给个具体点的实现步骤吗?
2楼的我试过,不行的。
3楼的明天试试。
再次补充:
3楼的我试过了,在OnTimer中调Invalidate(),不管里面传FALSE,TRUE,都是刷整个屏幕,其它好多控件都闪烁了。
另外,我的操作:在OnCtlColor()中,设置背景透明,pDC->SetBkMode(RANSPARENT);然后在OnTimer()中,重新写内容,然后调GetDlgItem(IDC_STC_DRAW)->GetParent->RedrawWindow(&rect);其中rect为static控件的区域。 展开
3个回答
展开全部
在MFC中用缓存技术进行绘图完全可以做到不闪烁,下面是在对话框应用程序OnPaint函数else分支中的代码,显示一行文本,仅用来测试:
CWnd * pWndShow;
CDC * pDCShow;
pWndShow = GetDlgItem(IDC_STC_DRAW); // static text控件ID
pDCShow = pWndShow->GetDC();
CDC memDC;
CRect rect;
CBitmap memBmp, *pOldBmp;
pWndShow->GetClientRect(rect);
memDC.CreateCompatibleDC(pDCShow);
memBmp.CreateCompatibleBitmap(&memDC, rect.Width(), rect.Height());
pOldBmp = memDC.SelectObject(&memBmp);
// 更新窗口
pWndShow->UpdateWindow();
// 背景用白色填充
memDC.FillSolidRect(rect, RGB(255,255,255));
// 设置为透明模式
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(100, 100, 不能打双引号了);
// 将内存DC中的内容拷贝到设备DC中
pDCShow->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
// 清理
memDC.SelectObject(pOldBmp);
memBmp.DeleteObject();
memDC.DeleteDC();
pWndShow->ReleaseDC(pDCShow);
在你需要刷新的地方调用对话框的函数Invalidate(FALSE);就行了。例如你的程序可以设置一个一秒的定时器,在里面刷新窗口就行了。
对于其他控件闪烁的情况,由于只在缓存中绘制了static text控件的部分,所以应该只重写static text控件。在定时器中改为调用对话框的InvalidateRect函数,第一个参数用static text控件在对话框中的位置,第二个参数同样用FALSE,具体用法请参看MSDN或百度百科。
CWnd * pWndShow;
CDC * pDCShow;
pWndShow = GetDlgItem(IDC_STC_DRAW); // static text控件ID
pDCShow = pWndShow->GetDC();
CDC memDC;
CRect rect;
CBitmap memBmp, *pOldBmp;
pWndShow->GetClientRect(rect);
memDC.CreateCompatibleDC(pDCShow);
memBmp.CreateCompatibleBitmap(&memDC, rect.Width(), rect.Height());
pOldBmp = memDC.SelectObject(&memBmp);
// 更新窗口
pWndShow->UpdateWindow();
// 背景用白色填充
memDC.FillSolidRect(rect, RGB(255,255,255));
// 设置为透明模式
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(100, 100, 不能打双引号了);
// 将内存DC中的内容拷贝到设备DC中
pDCShow->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
// 清理
memDC.SelectObject(pOldBmp);
memBmp.DeleteObject();
memDC.DeleteDC();
pWndShow->ReleaseDC(pDCShow);
在你需要刷新的地方调用对话框的函数Invalidate(FALSE);就行了。例如你的程序可以设置一个一秒的定时器,在里面刷新窗口就行了。
对于其他控件闪烁的情况,由于只在缓存中绘制了static text控件的部分,所以应该只重写static text控件。在定时器中改为调用对话框的InvalidateRect函数,第一个参数用static text控件在对话框中的位置,第二个参数同样用FALSE,具体用法请参看MSDN或百度百科。
展开全部
据我所知,就基本的mfc似乎做不到不能闪烁,但是每隔一秒刷一次,应该能不闪烁的,我按照楼主的要求做了个测试。
比如父窗口指针pParent,那么使用pParent->InvalidateRect(rect, FALSE);就我电脑观察,看不出有闪烁,但是如果间隔时间减少到500毫秒,还是会闪烁。
比如父窗口指针pParent,那么使用pParent->InvalidateRect(rect, FALSE);就我电脑观察,看不出有闪烁,但是如果间隔时间减少到500毫秒,还是会闪烁。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
重载run方法 在里面实现 不要用timer
重载run方法 在里面实现消息循环
利用peekmessage
在空闲时间刷你的屏幕
这样就可以避免使用timer
然后在你的实现代码里使用双缓冲
这样就不会闪烁了
这也是一些游戏的实现方法 例如 雷电
重载run方法 在里面实现消息循环
利用peekmessage
在空闲时间刷你的屏幕
这样就可以避免使用timer
然后在你的实现代码里使用双缓冲
这样就不会闪烁了
这也是一些游戏的实现方法 例如 雷电
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询