5048|7

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Wince双缓存问题(WTL) [复制链接]

我想在LRESULT CMyDlg ::OnEraseBkgnd ( HDC hdc )
中显示几张图片如果用
dcMem.SelectBitmap ( bmpBackground);
buffer.BitBlt(0,0,rc.Width(),rc.Height(),dcMem,0,0,SRCCOPY );
一张一张显示会出现图片闪烁,所以我想先画在一个缓存CDC中,再统一画到屏幕上,不知怎么做,请高手指教,缓存如何声明,建立,等等

最新回复

哈哈,终于mark过来一位老大  详情 回复 发表于 2008-3-18 14:34
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
//申明
CDC                m_dcBack;
CBitmap m_bmpBack;

//初始化
CClientDC dc(this);
//        CBrush brushBack;
CRect  rect;
GetClientRect(rect);       

//创建画线设备环境以及创建相应缓冲区
if (m_dcBack.GetSafeHdc() == NULL)
{
        m_dcBack.CreateCompatibleDC(&dc) ;
        m_bmpBack.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()) ;
        m_dcBack.SelectObject(&m_bmpBack) ;
}
       
m_dcBack.SetBkColor (CL_MAIN_BACK);
m_dcBack.SetTextColor(CL_MAIN_TEXT);


//Onpaint
void *****::OnPaint()
{
        CPaintDC dc(this); // device context for painting
       
        CRect rectClient;
        GetClientRect(rectClient);
       
        CDC memDC ;
        CBitmap memBitmap ;
        CBitmap* oldBitmap ;
       
        memDC.CreateCompatibleDC(&dc) ;
        memBitmap.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height()) ;
        oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;
       
        //将m_dcCoor和m_dcLine绘制到控件上
        if (memDC.GetSafeHdc() != NULL)
        {
                memDC.BitBlt(0, 0, rectClient.Width(), rectClient.Height(),
                                 &m_dcBack, 0, 0, SRCCOPY) ;       
               

                dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(),
                        &memDC, 0, 0, SRCCOPY) ;
        }
       
        memDC.SelectObject(oldBitmap) ;       
       
        //删除内存位图GDI对象
        memBitmap.DeleteObject();
        //删除内存绘图环境
        memDC.DeleteDC();       
        // Do not call CWnd::OnPaint() for painting messages
}


//调用时,直接调用
Invalidate(FALSE);  //最好还是用InvalidateRect的方式
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
Mark!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
这里那个是缓存,memDC还是m_dcBack,这两句有没有写错
memDC.BitBlt(0, 0, rectClient.Width(), rectClient.Height(),  
         &m_dcBack, 0, 0, SRCCOPY) ;


dc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(),  
&memDC, 0, 0, SRCCOPY) ;
能不能说明一下,是哪个画到哪个上,
m_dcBack是在类中保存的吗

谢谢
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
我写了一个函数用来显示透明位图:
//绘制位图函数,
/*
hdc:设备上下文
bmp:位图
x y: 绘制起点
w h:绘制大小
bx by:位图起点
c:制定颜色不绘制,可以打到透明的效果
*/
void paintBitmap(HDC hdc,CBitmap bmp,int x,int y,int w,int h,int bx,int by,COLORREF c)
{       
CDC dc(hdc);
SIZE size;
HDC   hMemDC   =   CreateCompatibleDC(NULL);   
   
HGDIOBJ   hOldBmp   =   SelectObject(   hMemDC   ,bmp);     

bmp.GetSize(size);
       

for(int i = bx; i < (((size.cx-bx)>w)?w:(size.cx-bx)); i++)
{
        for(int j = by; j < (((size.cy-by)>h)?h:(size.cy-by));j++)
        {
                 COLORREF   color   =   GetPixel( hMemDC,i,j);
                if (color != c)
                        dc.SetPixel(i+x,j+y,color);
        }
}
    SelectObject(   hMemDC   ,   hOldBmp   );  
        DeleteDC(   hMemDC   );  
}


为什么加入m_dcBack没有用,什么都不显示。如果不调用函数,直接写在paint或eraseground内部就可以显示?是不是CDC传参的问题,要怎么传呢?
谢谢
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
mark
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
搞笑,都来mark,那不是满是指纹。

闪烁问题以前我都回答很多次了,搜索一下就可以了。

人眼感到闪烁的原因是因为眼睛对颜色差异较大的图案反应比较明显,并不是你代码造成的,也不需要特意放在OnEraseBkgnd 中来画。

举个例子,如果是黑白两张图交替显示,你会明显感觉闪烁,如果都是两张黑图交替显示,你根本察觉不出来,而这时的代码是完全一样的。

解决问题的根本就是你需要一张和背景差不多的图,比如在paint中get原来的memdc,然后把你的bitmap 贴进去,然后把memdc->hdc。因为EraseBkgnd时会产生一个白屏,所以这里直接return true就行了。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
哈哈,终于mark过来一位老大
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表