请教如何强制刷新

charlie790801 2004-09-19 09:59:22
急求回复:这个问题烦我近一周了!
我在对话框上画图形, 其先我画了个方形,然后由于计算变化,需要擦除掉原来的方形画
比方形小的图形,比如三角形,请问如何把原来的方形去掉?
我尝试用invalidaterect函数,然后再画图,但是新画的图怎么都看不到了?请问是怎么回
事?
我在别的论坛提问了,有些人建议背景重画,但是我的背景并不是单调的背景,而是一张图,
如果要实现背景重画,需要怎么实现? 我可以定位图形变化的背景位置,但是具体的实现
过程请那位兄台赐教!


谢谢。
...全文
745 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
charlie790801 2004-09-22
  • 打赏
  • 举报
回复
呵呵,终于搞定问题了,谢谢各位阿。 我最终解决的方式是发送WM_ERASEBKGND,在该方法里面实现每次重画图,应该说是上面 roger_ding(海天一色)兄提到的方法,不过我以前没有做过,所以一直不明白你的意思,傍晚翻着 《实用vc++教程》,却看到了近似的例子,真是丢脸,这本书从我做这个小程序其就放在我的桌子上都没有好好利用,每次看到那页就马马虎虎跳过去了,每次都msdn却没有具体事例参考。 我想我把我的问题点数都给海天兄吧,谢谢你了!
charlie790801 2004-09-21
  • 打赏
  • 举报
回复
嗯,看到了! 我再试试看!
roger_ding 2004-09-21
  • 打赏
  • 举报
回复
WM_ERASEBKGND

如果没有用以下步骤:
打开ClassWizard
-> "Class info" tab
->"Advance Options"
->"Message filter"
->改为"Window"
ACuke 2004-09-20
  • 打赏
  • 举报
回复
InvalidateRect();
应该指定刷新的Rect吧
superinsect 2004-09-20
  • 打赏
  • 举报
回复
不管怎么样,你先画背景图,然后再画想画的形状到背景图上去就行了吧
DentistryDoctor 2004-09-20
  • 打赏
  • 举报
回复
InvalidateRect(rectUnion,TRUE)?
DentistryDoctor 2004-09-20
  • 打赏
  • 举报
回复
主要是InvalidateRect的参数得是现在的Rect与原来的方形的Union.其它我倒认为没什么必要,可以考虑双缓冲。
roger_ding 2004-09-20
  • 打赏
  • 举报
回复
估计很大可能是你的画图逻辑有问题,不是刷新的问题

把背景图放在OnEraseBkgnd里做,
画三角或方块就直接在dc上画,在OnPaint消息里
先照这种方法你改下,看还有问题吗
charlie790801 2004-09-20
  • 打赏
  • 举报
回复
对于roger_ding(海天一色) 兄提到的在OnEraseBkgnd中实现代码又是怎么回事?这个OnEraseBkgnd是怎么重载的?我怎么用classwizzard的对话框Message中找不到这个方法阿!
charlie790801 2004-09-20
  • 打赏
  • 举报
回复
不是阿,我还没有设置背景的时候也是出现那些问题,所以背景问题不要考虑了应该!怎么大家越说越复杂了? 我只是区域内新画的图象一闪一闪的, 我仔细看了,跟背景一点关系都没有, 及时我把背景的语句屏蔽掉,还是那些问题。
happyboy086 2004-09-20
  • 打赏
  • 举报
回复
我是菜鸟,我深深关注
snaill 2004-09-20
  • 打赏
  • 举报
回复
RedrawWindow
roger_ding 2004-09-20
  • 打赏
  • 举报
回复
你把return mBrush放到OnEraseBkgnd里试试,不要放在OnCtlColor里面
smallcrocodile 2004-09-20
  • 打赏
  • 举报
回复
InvalidateRect()
charlie790801 2004-09-20
  • 打赏
  • 举报
回复
我描述一下我的做法吧,我画背景的方式: 先把背景图片作为资源插入. 然后在对话框构造函数中编写: //载入图片
mDlgBkBmp=new CBitmap;
mDlgBkBmp->LoadBitmap(IDB_BITMAP1);
mBrush.CreatePatternBrush(mDlgBkBmp);
然后我重载CFanGameDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
添加代码 return mBrush;

画变化的图型的时候,我是要根据外在的计算,判断某个区域发生图型变换,这样,我就把该小区域InvalidateRect() , 然后在该区域上画变化后的图形形状. 这样就造成了图形显示一闪而过.而这一闪并没有对背景造成影响!

我尝试用内存法(??? 是不是就是所谓的双缓冲法),我现在内存设备环境中画图形,然后再bitblt到屏幕上,最后一个参数设置成SRCINVERT, 然后所画的图形也是一闪一闪,而且闪得非常怪异,有时候一些区域内图形有些显示出来,有些没有显示出来。 这里有一个问题就是我设置的内存位图m*n,但是我所画的区域并没有整个区域都画,所以用SCRCOPY参数的时候,就会把一些我再内存中没有画的区域显示到屏幕上,变成黑的,不知道有没有办法把内存位图初始化成为一种透明颜色的方式?
nwpulipeng 2004-09-20
  • 打赏
  • 举报
回复
帮顶中
charlie790801 2004-09-19
  • 打赏
  • 举报
回复
我刚才尝试用invalidaterect函数,然后发送一个消息WM_ERASEBKGND, 然后再画图,但是新画的图还是一闪而过.!
charlie790801 2004-09-19
  • 打赏
  • 举报
回复
InvalidateRect()只有两个参数,一个参数是需要设为无效的区域,令一个参数是bool型, 需要怎么指定擦除的背景?

后面一种方法的具体做法是什么?
i am trying!

roger_ding 2004-09-19
  • 打赏
  • 举报
回复
有个方法:
创建一个DC,大小为擦除的尺寸,SetViewportOrg为具体的位置,发送WM_ERASEBKGND给对话框,让它在新DC上画背景,然后在背景上画三角,再贴回原DC
roger_ding 2004-09-19
  • 打赏
  • 举报
回复
invalidaterect需要指定erasebackground
加载更多回复(3)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧