读书人

画图闪耀

发布时间: 2013-08-14 14:27:55 作者: rapoo

画图闪烁
我在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这种就不会闪烁。你的控件闪烁的原因最开始有前景有背景,重画时最开始只有背景,画完又是有前景有背景,所以会闪烁。所以经常用的解决办法就是在内存里生成一个位图,把要画的画在内存里的位图里,画好之后一次贴到界面上。

读书人网 >C++ Builder

热点推荐