VC 闪屏问题
VC2008Express本来是不闪的WM_Paint里我一进去SetBkMode(memdc,TRANSPARENT);hdc=BeginPaint(hWnd,&ps)...
VC2008Express
本来是不闪的
WM_Paint里
我一进去
SetBkMode(memdc,TRANSPARENT);
hdc = BeginPaint(hWnd, &ps);
就马上swtich了
switch state:
case 1:画开始菜单
case 3:进入程序内部
我在case 1的时候是如下程序
membitmap = CreateCompatibleBitmap(hdc,width,height);
SelectObject(memdc,membitmap);
BitBlt(memdc,0,0,width,height,menudc,0,0,SRCCOPY);
不闪的,但是把它改成
ShowPicflash("../menuhg.jpg",hWnd,1024,768);
闪了不说,还在Switch进case 3的时候依然闪
case WM_TIMER:
count++;
if (count==40){
count = 0;
}
InvalidateRect(hWnd,NULL,false); //这句注释掉就不闪了,但是屏幕更新也要手动了,改数字也影响闪的频率
break;
有没有办法让它在state 3的时候不闪
我当然百度和 CSDN上搜索过双缓冲,不行了才出来问的,看代码吧
HRESULT ShowPicflash(char *lpstrFile,HWND hWnd,int nScrWidth,int
nScrHeight)
memdc=GetDC(hWnd);如果去掉这句开始画的时候就什么都没有,透明
其他的都是检查画图什么的我也就没改,画在memdc上(extern)因为否则的话,画好后鼠标响应就消失了 展开
本来是不闪的
WM_Paint里
我一进去
SetBkMode(memdc,TRANSPARENT);
hdc = BeginPaint(hWnd, &ps);
就马上swtich了
switch state:
case 1:画开始菜单
case 3:进入程序内部
我在case 1的时候是如下程序
membitmap = CreateCompatibleBitmap(hdc,width,height);
SelectObject(memdc,membitmap);
BitBlt(memdc,0,0,width,height,menudc,0,0,SRCCOPY);
不闪的,但是把它改成
ShowPicflash("../menuhg.jpg",hWnd,1024,768);
闪了不说,还在Switch进case 3的时候依然闪
case WM_TIMER:
count++;
if (count==40){
count = 0;
}
InvalidateRect(hWnd,NULL,false); //这句注释掉就不闪了,但是屏幕更新也要手动了,改数字也影响闪的频率
break;
有没有办法让它在state 3的时候不闪
我当然百度和 CSDN上搜索过双缓冲,不行了才出来问的,看代码吧
HRESULT ShowPicflash(char *lpstrFile,HWND hWnd,int nScrWidth,int
nScrHeight)
memdc=GetDC(hWnd);如果去掉这句开始画的时候就什么都没有,透明
其他的都是检查画图什么的我也就没改,画在memdc上(extern)因为否则的话,画好后鼠标响应就消失了 展开
3个回答
展开全部
为什么要双缓存?
一般不需要。只需要一个MemoryDC即可。
不闪烁的做法。
1。
WIN32 Application 中注册窗口时,不要设置背景Brush。
WNDCLASSEX wcex;
wcex.hbrBackground = 0;
(如此做法,系统不会默认画背景了)
2。
所有的画图函数,都在MemoryDC上画,切忌直接在DC上画。
以上两步可直接解决闪烁的问题。
(直接在DC画,每画一次,屏幕就会刷新一次)
从你的程序中看,有问题的是你的ShowPicflash("../menuhg.jpg",hWnd,1024,768);
传递的参数是窗口句柄,那么估计这个函数画图像肯定是通过GetDC()来取得DC。那么就违反了我说的第二步。
解决方式改ShowPicflash函数,那参数改成HDC,且传递的是MemoryDC句柄。
另外请检查我的第一部。
一般不需要。只需要一个MemoryDC即可。
不闪烁的做法。
1。
WIN32 Application 中注册窗口时,不要设置背景Brush。
WNDCLASSEX wcex;
wcex.hbrBackground = 0;
(如此做法,系统不会默认画背景了)
2。
所有的画图函数,都在MemoryDC上画,切忌直接在DC上画。
以上两步可直接解决闪烁的问题。
(直接在DC画,每画一次,屏幕就会刷新一次)
从你的程序中看,有问题的是你的ShowPicflash("../menuhg.jpg",hWnd,1024,768);
传递的参数是窗口句柄,那么估计这个函数画图像肯定是通过GetDC()来取得DC。那么就违反了我说的第二步。
解决方式改ShowPicflash函数,那参数改成HDC,且传递的是MemoryDC句柄。
另外请检查我的第一部。
展开全部
请你百度vc 双缓存 闪烁
其实主要原因就是InvalidateRect会使用默认的颜色(通常是白色)擦除图像背景,然后重新绘制,所以会感觉到闪烁(就是擦得那一下)。双缓存的原理就是先将下一幅图片绘制到一个内存dc上,绘制好了 直接贴到原来的位置,因为没有擦背景,所以不会闪。具体代码自己搜吧,一大片一大片的。
其实主要原因就是InvalidateRect会使用默认的颜色(通常是白色)擦除图像背景,然后重新绘制,所以会感觉到闪烁(就是擦得那一下)。双缓存的原理就是先将下一幅图片绘制到一个内存dc上,绘制好了 直接贴到原来的位置,因为没有擦背景,所以不会闪。具体代码自己搜吧,一大片一大片的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ShowPicflash 这个函数..有问题
闪烁是因为表面经过了2次绘制,且2次颜色不同,如果2次颜色相同就不会闪。
双缓存也就是这样解决的。
很明显是你的 ShowPicflash 函数内,第一次填充了背景,然后第二次bitblt将图案填充到表面
所以闪烁。
闪烁是因为表面经过了2次绘制,且2次颜色不同,如果2次颜色相同就不会闪。
双缓存也就是这样解决的。
很明显是你的 ShowPicflash 函数内,第一次填充了背景,然后第二次bitblt将图案填充到表面
所以闪烁。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询