谁有在窗体上显示图片,在重绘时不闪烁的源码啊? 能给我一下不?我邮件地址[email protected]

解决方案 »

  1.   

    先用内存画,再画到窗口上就可以了。
    CBitmap memBitmap;
    CBitmap* pOldBmp = NULL;
    memDC.CreateCompatibleDC(pDC);
    memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
    pOldBmp = memDC.SelectObject(&memBitmap);
    memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
    DrawWave(&memDC);//在drawwave中用内存DC:memDC先画好。
    pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp);
    memDC.DeleteDC();
    memBitmap.DeleteObject();
      

  2.   


    void CCalendarCanvas::OnPaint()
    {
    CPaintDC dc(this);
    HDC hDC = dc.GetSafeHdc(); CRect rect;
    GetClientRect(rect);

    // 创建后备缓冲区
    HDC hdcMemory = ::CreateCompatibleDC(hDC);
    HBITMAP hBitmap = ::CreateCompatibleBitmap( hDC, rect.Width(), rect.Height());
    HGDIOBJ hOriginalBmp = ::SelectObject(hdcMemory, hBitmap);
    {
    // 线性渐变背景
    Graphics graph(hdcMemory);
    LinearGradientBrush brush( PointF( rect.left, rect.top)
    , PointF( rect.right, rect.bottom)
    , Color( 0xFF, 0xFF, 0xFF)
    , Color( 0x00, 0x00, 0x00)
    );
    graph.FillRectangle( &brush
    , 0
    , 0
    , rect.Width()
    , rect.Height()
    );
    }

    {
    int nLeft = (rect.Width()-CANVAS_WIDTH)/2;
    int nTop =  (rect.Height()-CANVAS_HEIGHT)/2;
    // 调用另一个函数画主体
    Graphics graph(hdcMemory);
    Draw( graph, nLeft, nTop);
    } ::BitBlt( hDC
    , 0
    , 0
    , rect.Width()
    , rect.Height()
    , hdcMemory
    , 0
    , 0
    , SRCCOPY
    );
    ::SelectObject(hdcMemory, hOriginalBmp);
    ::DeleteObject(hBitmap);
    ::DeleteDC(hdcMemory); 
    }