我的功能是这样的:
视图上显示了一个图片作为背景. 然后在这个上面要用双缓冲的方式在指定的一个区域内显示透明的字. 这个字其实就是一组抽奖名单,要不停地在这个区域内滚动显示.知道的帮个忙,解决之后立即给分.下面是我的代码,存在很多问题,一个就是在这块区域内除了字之外的背景为黑色.
二是滚动效果的时候图像重叠了.CDC MemDC; 
CRect rect;    //视图上的一块区域CDC *pDC = GetDC();CBitmap MemBitmap;MemDC.CreateCompatibleDC(NULL);
dcCache.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);//MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));MemDC.SetTextColor(color);    
//MemDC.SetBkMode(TRANSPARENT);
CFont *pOldFont2 = (CFont*)MemDC.SelectObject(&font);MemDC.TextOut(0,0,sName);  //sName每次循环的时候都有不同的值
::TransparentBlt(pDC->m_hDC,0,0,rect.Width(),rect.Height(),MemDC.m_hDC,0,0,rect.Width(),rect.Height(),RGB(255,255,255));MemDC.SelectObject(pOldFont2);MemBitmap.DeleteObject();
MemDC.DeleteDC();

解决方案 »

  1.   

    在把内存位图选入内存设备内容之后,用你指定的透明色FillRect一下,然后指定一个非透明色的颜色绘制文本,最后再把画好的图片刷上去就OK了。
      

  2.   

    噢。。对哦。。
    [email protected]
      

  3.   

    QuickGo() 
    在把内存位图选入内存设备内容之后,用你指定的透明色FillRect一下,然后指定一个非透明色的颜色绘制文本,最后再把画好的图片刷上去就OK了。请教一下透明色怎么弄? 用RGB(255,255,255) ,这样随便弄一个颜色?
      

  4.   

    不用啊``SetBkMode(TRANSPARENT)就可以透明啦`
      

  5.   

    我随便指定了个颜色FillRect,第一个问题解决了.
    现在就是第二个问题,滚动的时候上次画的东西没刷掉.都重叠在一起了.
      

  6.   

    其实就是背景图上写字,然后按设置时间刷新view使之看上去象动画...
    void CxxxxView::mixFrame(CDC *pDC, HBITMAP hBGbitmap, const CPoint &pt,
                             const CString &drawText)
    {
        CDC memDC1,memDC2;
        CBitmap srcBitmap,destBitmap;
        CBitmap *pOld1,*pOld2;
        //克隆原背景图,原背景图没变化
        memDC1.CreateCompatibleDC(pDC);
        memDC2.CreateCompatibleDC(pDC);
        srcBitmap.Attach(hBGbitmap);
        BITMAP bm;
        srcBitmap.GetObject(sizeof(BITMAP),&bm);
        destBitmap.CreateCompatibleBitmap(pDC,bm.bmWidth,bm.bmHeight);
        pOld1 = (CBitmap *)memDC1.SelectObject(&srcBitmap);
        pOld2 = (CBitmap *)memDC2.SelectObject(&destBitmap);
        memDC2.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memDC1,0,0,SRCCOPY);
        memDC1.SelectObject(pOld1);
        srcBitmap.Detach();
        // draw the string
        CFont *pOldfont = (CFont *)memDC2.SelectObject(&font);
        COLORREF cr = memDC2.SetTextColor(color);
        int oldMode = memDC2.SetBkMode(TRANSPARENT);
        memDC2.TextOut(pt.x, pt.y, drawText);
        //show it...
        pDC->BitBlt(0,0,bm.bmWidth,bm.bmheight,&memDC2,0,0,SRCCOPY);    // cleanup
        memDC2.SelectObject(pOldfont);
        memDC2.SelectObject(pOld2);
    }
    ======================================================================
    随手写的,可能有错误,参数hBGbitmap是载入的bg图句柄,pt是要写字的坐标..
    把mixFrame放在ondraw(),只要在一个timer里不断改变pt坐标的值,然后Invalidate(),看上去就象动画在卷动.如果要拉伸,把BitBlt()改为StretchBlt(),防止闪烁在OnEraseBkgnd()里return 1.
      

  7.   

    楼上的,感觉下面这个可以不用吧?因为创建的DC是局部的,都销毁了还还原它的画图设备干吗?memDC2.SelectObject(pOldfont);
    memDC2.SelectObject(pOld2);
      

  8.   

    楼上的,以前就是用InvalidateRect,但是会有闪烁了.后来才改了双缓冲
      

  9.   

    楼上的,我把内存DC的背景填充为白色是解决了第一个问题.
    MemDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255));现在就是第二个问题,滚动的时候上次画的东西没刷掉.都重叠在一起了
      

  10.   

    InvalidateRect第二个参数就是说要不要擦背景,不擦背景就不会闪了。
      

  11.   

    双缓冲也是要InvalidateRect的啊,双缓冲的只不过说是先画在后台,然后一次头用BitBlt之类的画到前台而已。InvalidateRect是通知Windows更新你的窗口。
      

  12.   

    gamedragon(gamedragon) 
    不擦背景就发生重叠了.
      

  13.   

    To haoder(www.remai.com) 
    不擦前台的背景,后台的背景还是要擦的啊。InvalidateRect是通知Windows擦前台的背景。
    后台背景擦掉再写新的,然后BitBlt完全用后台的东西替换到前台来,所以不会发生重叠。
      

  14.   

    OnPaint
    memdc = create mem dc;
    bmp = create bmp;
    memdc.selectobect(bmp);
    memdc.erasebackground;
    memdc.drawtext;
    paintdc.bitblt(memdc);
    ...OnTimer:
    get new number;
    InvalidateRect(&rect, FALSE);
      

  15.   

    InvalidateRect(&rect, FALSE); 不能解决. 请大家继续帮忙.
      

  16.   

    LZ可以试试用BitBlt替换TransparentBlt。