读书人

大家看看小弟我的双缓冲解决屏幕闪动为

发布时间: 2012-02-06 15:52:44 作者: rapoo

大家看看我的双缓冲解决屏幕闪动为什么没有效果,十万紧急!!! (代码可以直接运行) - C++ Builder / Windows SDK/API
int y[880] ;
float x=0;
int z=rand();
for (int i=0;i <880;i++)
{
y[i]=sin(x+z)*100;
x=x+3.1415/40;
}
TPoint pot[800];
int xx=0;
int i=0;

for (int j=0; j <800;j++)
{
pot[j]=Point(xx,y[i]+100);
xx=xx+1;
i++;
}
COLORREF BC;
COLORREF pc;
HBRUSH BrushObject ; //画刷
HPEN PenObject ; // 画笔
pc=RGB(0,255,0);
BC=RGB(255,255,255);
BrushObject=CreateSolidBrush(BC);
PenObject=CreatePen(PS_SOLID,1,pc) ;
HDC hdc;

hdc=Form1-> Image1-> Canvas-> Handle ;
hMemDC=CreateCompatibleDC(NULL); //创建虚拟DC
hBmp=CreateCompatibleBitmap(hdc,600,250);// 创建bitmap
SelectObject(hMemDC,hBmp); // 选中 创建的DC
SelectObject(hMemDC,PenObject);

FillRect(hMemDC,&kk,BrushObject); // 刷新位图
Polyline(hMemDC,pot,799); // 画图
BitBlt(hdc,16,8,600,250,hMemDC,0,0,SRCCOPY); //复制

DeleteDC(hMemDC);
DeleteObject(hBmp);
DeleteObject(BrushObject);


放在定时器事件里 图象一动也不动 郁闷死了 大家帮忙看看呀

[解决办法]
不用这么麻烦搞双缓冲
双缓冲直接用Fom1-> DoubleBuffer=true;就可以了
[解决办法]
不要在画图的函数里频繁的CreateCompatibleDC和DeleteDC,这样反而效率更低。
[解决办法]
> > 我也知道这样不好  但是又不能设为全局变量  没什么好办法呀
为什么不能设为全局变量呢,你不是在用Form1吗,它就是全局变量。
就算不能设为全局变量,也可以设为类的成员变量呀,你不是在用Image1吗。

另外,画不出图象,是因为image对图象重绘有自己的处理。
对于这种情况,你应该用TPaintBox比较好,它的效率比image高。但是一旦它上边的图象被擦除,就不会自己重画上,所以如果有需要的话,你需要在它的WM_PAINT消息里自己重画。
[解决办法]
很多东西并不是单方面的突出就是好,走往一个极端的同时也会产生不同的负面影响.
[解决办法]
以前做过,一般创建两个画板,一个作为拼接画面用,另一个作最终显示用,好象有个网站有代码,我忘了,只有自己找一下。

读书人网 >C++ Builder

热点推荐