首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

画图闪耀

2013-08-14 
画图闪烁我在Paint消息里的画图,很闪,代码如下:[解决办法]真心不会闪啊.#include math.h#pragma link C

画图闪烁
我在Paint消息里的画图,很闪,代码如下:


[解决办法]
真心不会闪啊.

#include <math.h>
#pragma link "C:\\Program Files\\Borland\\CBuilder6\\Lib\\Psdk\\msimg32.lib"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   #define bmw 500
   #define bmh 500
   static bool scan=false;
   if(scan==true)
   {
      scan=false;
      return;
   }
   scan=true;
   int R;
   if(bmw>bmh)
      R=bmh>>1;
   else
      R=bmw>>1;

   Graphics::TBitmap *bk=new Graphics::TBitmap();
   Graphics::TBitmap *fk=new Graphics::TBitmap();

   bk->Width=bmw;
   bk->Height=bmh;
   bk->Canvas->Brush->Color=0;
   bk->Canvas->FillRect(Rect(0,0,bmw,bmh));
   bk->Canvas->Pen->Color=0x4500;


   for(int i=0;i<=bmw;i+=50)
   {
      bk->Canvas->MoveTo(0,i);
      bk->Canvas->LineTo(bmw,i);
   }

   bk->Canvas->Pen->Color=0x6000;
   for(int i=0;i<=bmh;i+=50)
   {
      bk->Canvas->MoveTo(i,0);
      bk->Canvas->LineTo(i,bmh);
   }

   fk->Assign(bk);
   fk->Canvas->Brush->Color=0xff;



   BLENDFUNCTION m_bf={0,0,8,0};

   fk->Canvas->Pen->Color=0x800000;
   fk->Canvas->Pen->Width=2;

   static float di=0;
   static int mcx=0;
   RECT Trect;
   int  Tr;
   while(scan)
   {
      fk->Canvas->MoveTo(bmw>>1,bmh>>1);
      fk->Canvas->LineTo((bmw>>1)-R*sin(di),(bmh>>1)-R*cos(di));
      if(mcx++>60)
      {
         ::AlphaBlend(fk->Canvas->Handle,0,0,bmw,bmh,bk->Canvas->Handle,0,0,bmw,bmh,m_bf);
         mcx=0;
      }
      if(random(20)==10)
      {
         Tr=random(R>>1)+(R>>1)-16;
         Trect.left=(bmw>>1)-Tr*sin(di-0.1);
         Trect.top=(bmh>>1)-Tr*cos(di-0.1);
         Trect.right=Trect.left+random(8)+1;
         Trect.bottom=Trect.top+random(8)+1;
         fk->Canvas->FillRect(Trect);
      }
      BitBlt(Canvas->Handle,10,10,bmw,bmh,fk->Canvas->Handle,0,0,SRCCOPY);
      di+=0.001;
      Application->ProcessMessages();
   }

   delete bk;
   delete fk;
}
//---------------------------------------


[解决办法]
引用:

Quote: 引用:

是不是在变化时闪?

是的
我想编写一个组件,继承自TCustomControl类,并在paint事件中用gdi+来绘图,有两张图,一张表盘,一张指针,当针旋图片转时,整个图就会闪烁利害

在组件的构造函数中,打开双缓冲会出问题,问题分为两种:

__fastcall twinControlWatch::twinControlWatch(TComponent* Owner)
        : TCustomControl(Owner)
{
     this->DoubleBuffered = true;//打开这个设置的话,在控件设计时,可以正常显示,但程序运行时,时有时无,不正常
     this->Parent->DoubleBuffered = true;//打开这个设置时,控件一加载就,IDE就报错,无法继续操作
}


可以看1cctv在6、7两楼的回复,一般闪烁的原因就是图像有几次快速反复的变化,比如A->B->A这种变化模式在人眼看来就是闪烁,A->B这种就不会闪烁。你的控件闪烁的原因最开始有前景有背景,重画时最开始只有背景,画完又是有前景有背景,所以会闪烁。所以经常用的解决办法就是在内存里生成一个位图,把要画的画在内存里的位图里,画好之后一次贴到界面上。

热点排行