关于闪烁这个话题 我寻找到了一些解决和一些灵感
当别的窗口在他上面的时候,闪,有没有试过把窗口移到左下脚,就是窗口被两个以上窗口覆盖时,有什么反应?我当时做的控件的内容都掉了!!!,不过没用别人的控件,后来我精确计算需要重画控件的哪个部分,代码写了一大缧,你的闪主要是不管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#里面也有。
这真的是……无语。
但是它实现的效果不是非常好,但的确是一种解决方法。不管怎么说,我都是为了学习才学习的,一定要把它做到非常好才可以。
而且这个界面的却写的不是很友好,我还是很想把它写的好一点的。
关于闪烁这个话题 我寻找到了一些解决和一些灵感
最新推荐文章于 2024-10-11 00:14:28 发布