在一个基于对话框的应用程序中,用CreateWindows()另外创建了一个窗口(window2),
现在在window2中画实时显示的背景图,达到了无闪烁的动画效果。
现在想在背景图上面另外画一些小图标,可这些小图标却老是闪烁显示啊?
大虾们,怎么才能让它们也不闪啊?
UP者有分。   《《 很急,真帮忙解决问题的,可以另开贴给分。》》

解决方案 »

  1.   

    用背景色重画不行?或者直接内存copy
      

  2.   

    用双缓冲进行刷新void CMyEdit::OnPaint()
    {
    //在View中显示整个界面背景位图(覆盖其中的编辑框),编辑框取出其外框区域内的背景位图。
    CPaintDC dc(this); // device context for painting
    CRect re; 
    GetClientRect(&re);//得到Edit控件的外框,即背景区域 if(bFirst){
     //第一次刷新,取得编辑框下的背景位图(不是载入的位图资源),
    memDC->CreateCompatibleDC(&dc);
    bFirst=FALSE;
    //关键就是我不会保存该背景位图(在没写入文字前的背景),下次刷新前怎样载入它?
    bitmap.CreateCompatibleBitmap(&dc,re.Width(),re.Height());
    oldBmp=memDC->SelectObject(&bitmap);  //选入取得的背景位图。
    memDC->BitBlt(0,0,re.Width(),re.Height(),&dc,0,0,SRCCOPY);//载进缓存上下文。
    bitmap.DeleteObject();
    }
    else { //这里如何载入保存的背景位图? } LOGFONT lf;
    GetFont()->GetLogFont(&lf);
    memDC->SetBkMode(1);
    memDC->SelectObject(GetFont()); for() //显示文字的循环。
    {
    ......
    memDC->TextOut(0, i*nLineH, p);
    } dc.BitBlt(0,0,re.Width(),re.Height(),memDC,0,0,SRCCOPY);
    memDC->SelectObject(oldBmp);
    }
      

  3.   

    duqiang2050(杜杜), 你的程序是如何使用双缓冲功能的啊?
      

  4.   

    我用过两个memDC,可是不行啊。另说明一下,我的背景图是实时变换的图像
      

  5.   

    不知道你实时显示的背景图是怎么做的,能说一下吗?
    建议:
    多做几个memDC,每个小图标分别做一个memdc
    例如:
    memdcIcon1.SelectObject(hIcon1);
    memdcIcon2.SelecctObject(hIcon2);
    memdcBk.SelectObject(hBitmap);//hbitmap背景图
    Bitblt(memdcBk,.....memdcIcon1);
    Bitblt(memdcBk,.....memdcIcon2);
    然后
    Bitblt(hdc,...memdcBk);
      

  6.   

    对了,在对话框的背景设置代码最好写在WM_EREASEBKGROUD消息处理里面
      

  7.   

    checkyvc6(checkyvc6) ,“多做几个memDC,每个小图标分别做一个memdc”,按你说得,我只显
               示一个图标也闪烁的啊?我的背景图数据是从*.avi文件中读取的。
               还有WM_EREASEBKGROUD在什么情况下会触发它啊?
      

  8.   

    WM_ERASEBKGND是在刷新时如果要擦除背景时触发。
    比如Resize时或者调用Invalidate(...,True)时。
      

  9.   

    大概记得:简单做法:建立一个 Timer,触发时从 avi 中取得 bitmap 后,放入一个 dc 中,再把另外的小图标写入这个 dc 中,可以同时进行颜色屏蔽,达到部分透明效果,然后将这个 dc 写入 window 的 dc 中。我就是这么实现的,对于小尺寸 avi 效果很好。如果要对付大尺寸,那就要重写 timer 部分了,比较麻烦。不闪烁的关键是对 window 的 dc 每个周期内只写一次,就是先在内存中写好。
      

  10.   

    哦,我是通过消息来刷新的。ok,我可以用WM_ERASEBKGND来试一试,谢谢!!
      

  11.   

    对了,忘说了,在上面双缓冲的基础上
    还要重载WM_ERASEBKGND消息
    BOOL CNanrenView::OnEraseBkgnd(CDC* pDC) 
    {
    return false;
    }我给你一段我的代码,是“是男人就下100层的网络版”中的画图代码:void CNanrenView::draw()
    {
    pMemDC->BitBlt(0,0,643,436,bmp0,0,0,SRCCOPY);
    for(int i=0;i<6 ;i++)
    {
    pMemDC->BitBlt(fl[i],400-i*60-hight,96,16,bmp1,32*9,0,SRCCOPY);
    }
    for(int j=1;j< 20;j++)
    {
    //if(data[j].flg!=127)
    {
    pMemDC->BitBlt(data[j].x,data[j].y,32,32,bmp2,32*data[j].flg,32*data[j].sst,SRCAND);
    pMemDC->BitBlt(data[j].x,data[j].y,32,32,bmp1,32*data[j].flg,32*data[j].sst,SRCPAINT); 
    }
    }
    InvalidateRect(re);
    IsLock=false;
    return;

    void CNanrenView::OnDraw(CDC* pDC)
    {
    if (in==0)
    {//第一次调用,用于初始化
    CBitmap bitmap,bitmap2,bitmap3,bit;
    bitmap.LoadBitmap(IDB_BITMAP1); 

    pMemDC=new CDC;
    bmp0=new CDC;
    bmp1=new CDC;
    bmp2=new CDC;

    pMemDC->CreateCompatibleDC(pDC);
    pMemDC->SelectObject(&bitmap);

    bit.LoadBitmap(IDB_BITMAP1) ;
    bmp0->CreateCompatibleDC(pDC);
    bmp0->SelectObject(&bit);


    bitmap2.LoadBitmap(IDB_BITMAP2);
    bmp1->CreateCompatibleDC(pDC); 
    bmp1->SelectObject(&bitmap2);

    bitmap3.LoadBitmap(IDB_BITMAP3);
    bmp2->CreateCompatibleDC(pDC); 
    bmp2->SelectObject(&bitmap3);

    CRect* re=new CRect;
    //背景
    pMemDC->BitBlt(100,100,32,32,bmp1,32*8,0,SRCCOPY); 
    in=1;
    }
    CNanrenDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    pDC->BitBlt(0,0,634,436,pMemDC,0,0,SRCCOPY); 
    }BOOL CNanrenView::OnEraseBkgnd(CDC* pDC) 
    {
    return false;
    }这样就完成了,我在需要重画的时候调用draw()函数,它就改变了pMemDC,同事激发了OnDraw,不需要我控制重画的时候OnDraw就自动重画了。代码绝对可用
      

  12.   

    给你提个建议:
    可以建立两个内存DC,一个用来存放源图片,一个用来完成图片的重画
    然后再将重画完的内存DC中的图片,用Bitblt函数拷贝到,显示器DC,这样
    你的图片就不回闪烁了!
    祝你成功!
      

  13.   

    谢谢大家的帮忙,明天我上班按大家的方法调试通过马上散分。vcforever(霓裳羽衣),可否说得明白一些啊?可以的话写个简单得例子吧,
                        我是否要对背景图或每个图标都分别用两个内存DC啊?
      

  14.   

    问题解决了,谢谢大家,散份。checkyvc6(checkyvc6)请另外来拿分