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控件的区域。
展开
 我来答
测绘地理信息
推荐于2016-01-03 · TA获得超过2204个赞
知道小有建树答主
回答量:516
采纳率:100%
帮助的人:470万
展开全部
在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或百度百科。
百度网友917c7ea
2010-11-23 · TA获得超过374个赞
知道小有建树答主
回答量:178
采纳率:0%
帮助的人:207万
展开全部
据我所知,就基本的mfc似乎做不到不能闪烁,但是每隔一秒刷一次,应该能不闪烁的,我按照楼主的要求做了个测试。
比如父窗口指针pParent,那么使用pParent->InvalidateRect(rect, FALSE);就我电脑观察,看不出有闪烁,但是如果间隔时间减少到500毫秒,还是会闪烁。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zqqmt_forever
2010-11-24 · 超过50用户采纳过TA的回答
知道答主
回答量:168
采纳率:0%
帮助的人:139万
展开全部
重载run方法 在里面实现 不要用timer
重载run方法 在里面实现消息循环
利用peekmessage
在空闲时间刷你的屏幕
这样就可以避免使用timer

然后在你的实现代码里使用双缓冲
这样就不会闪烁了
这也是一些游戏的实现方法 例如 雷电
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式