关于闪烁这个话题 我寻找到了一些解决和一些灵感

本文探讨了解决窗口在切换时出现的闪烁问题,提供了一种通过精确计算需要重绘的控件部分来减少闪烁的方法,并介绍了双缓冲技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于闪烁这个话题 我寻找到了一些解决和一些灵感

当别的窗口在他上面的时候,闪,有没有试过把窗口移到左下脚,就是窗口被两个以上窗口覆盖时,有什么反应?我当时做的控件的内容都掉了!!!,不过没用别人的控件,后来我精确计算需要重画控件的哪个部分,代码写了一大缧,你的闪主要是不管3721,重画了所有控件,造成的闪!!!!

这个似乎可以有一些解释的作用,精确计算我需要重画的部分。的却就是一种解决的方法。


首先你用BitBlt把程序退出前的整个窗体的内容复制下来,比如复制到一个picturebox里,然后在让窗体隐藏,往屏幕上复制刚才的图片,每次复制都让图片变小一点,以达到你原来窗体的那种效果,这里告诉你个技巧,往屏幕复制东西,会在上面留下痕迹,要比较好的消除又不会影响屏幕的显示比如困难,因此你可以在每一次复制之前把原窗体所在位置的桌面抓下来,放在另一个picturebox里或form里,autoredraw设为true,在原窗体消失后以上在其位置上让上这个picturebox或form,往屏幕复制东西改为往这个picturebox/form复制东西,因为其autoredraw为true,因此可以很容易的用cls消除刚复制上的东西而不影响到桌面。而这里所显示的背景(桌面其实是一小块抓下来的图片。就是这样。说得这么多,你不会不清楚吧?

这个解决了我的一种负担或者是 不能完美 等的羁绊。实际上,有一些我们想做出来的东西,看上去很完美,但是实现却是很朴素的方法。我们只是希望方法能够解决地更好一些。



我在一个背景上,用键盘移动一个图片:  
  View的成员变量:  
  CDC*   pMemDC;  
  CDC   *bmp0,*bmp1,*bmp2;  
  int   x,y;  
  实现:  
  void   CNanrenView::OnDraw(CDC*   pDC)  
  {  
  CNanrenDoc*   pDoc   =   GetDocument();  
  ASSERT_VALID(pDoc);  
  pDC->BitBlt(0,0,634,436,pMemDC,0,0,SRCCOPY);    
  }  
   
  LRESULT   CNanrenView::DefWindowProc(UINT   message,   WPARAM   wParam,   LPARAM   lParam)    
  {  
  if   (message==WM_KEYDOWN)  
  {  
  switch(   wParam   )    
  {  
  case   0x26:  
  y--;  
  break;  
  case   0x28   :  
  y++;  
  break;  
  case   0x25:  
  x--;  
  break;  
  case   0x27:  
  x++;  
  break;  
  }  
  pMemDC->BitBlt(90+x*10,90+y*10,52,52,bmp0,90+x*10,90+y*10,SRCCOPY);  
  pMemDC->BitBlt(100+x*10,100+y*10,32,32,bmp1,0,0,SRCCOPY);    
  InvalidateRect(CRect(90+x*10,90+y*10,90+x*10+52,90+y*10+52));  //这里既然是重画,肯定是将原来地消了。
  }  
  return   CView::DefWindowProc(message,   wParam,   lParam);  
  }  
   
  图片再CRect(90+x*10,90+y*10,90+x*10+52,90+y*10+52)范围内还是闪烁,怎么回事?

BOOL   CNanrenView::OnEraseBkgnd(CDC*   pDC)  
  {  
  return   FALSE;//不能少  
  }

由于没有了背景,应先画上白色。  
   
  CRect   rect;  
  GetClientRect(rect);  
  pMemDC->FillSolidRect(rect,   RGB(255,   255,   255));

这个毕竟是用mfc写地,有一些看不动。但是它使用地是双缓冲bitblt,我还无法确定是否要用framwork中地重载函数。但是这确定了我自己来写这个控件地决心。这对我来说是很有用地。

OnCreate加一句  
  Image1->Parent->DoubleBuffered=true;Top
高人!这是什么意思?Top
开双缓冲,一般就不会闪烁

拷,c++builder中有这种东西
………………………………然后我发现……c#里面也有。
这真的是……无语。

但是它实现的效果不是非常好,但的确是一种解决方法。不管怎么说,我都是为了学习才学习的,一定要把它做到非常好才可以。
而且这个界面的却写的不是很友好,我还是很想把它写的好一点的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值