有A、B、C、D、。。几张图(Bitmap),我想每次先在窗口DC上画A,再将B透明地盖上去,30毫秒后又在相同位置上画A,再将C透明地盖上去,继续处理A/D、A/E、void CMyDialog::Test()
{
   CBitmap * pOld;
   CDC * pDC = GetDC();
   CDC mdc;
   mdc.CreateCompatibleDC(pDC);
   pOld = mdc.SelectObject(&m_bmpA); //CBitmap m_bmpA;  m_bmpA.LoadBitmap(IDB_A);
   pDC->BitBlt(0, 0, 100, 100, &mdc, 0, 0, SRCCOPY);
   mdc.SelectObject(&m_bmpB);
   TransparentBlt(pDC->m_hDC, 0, 0, 100, 100, mdc.m_hDC, 0, 0, 100, 100, RGB(0,0,0));
   mdc.SelectObject(pOld);
   mdc.DeleteDC();
   pDC->ReleaseDC();
}请问如何画?为什么我的方法Test()不行?

解决方案 »

  1.   

    BOOL CDrawTest::OnInitDialog() 
    {
    SetTimer(1,100,NULL);
      i=0;//全局变量
    }//设置时钟void CDrawTest::OnTimer(UINT nIDEvent) 
    {//创造内存DC在其中画图,再贴到控件DC中
    CRect rect;

    // 获取绘制坐标的文本框
    CWnd* pWnd = GetDlgItem(IDC_COORD);

    pWnd->GetClientRect(&rect);
    // 指针
    pDC = pWnd->GetDC();
        //内存绘图
        CBitmap memBitmap;
    CBitmap* pOldBmp = NULL;
    memDC.CreateCompatibleDC(pDC);
    memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom); if( i%4 == 0 )
    memBitmap.LoadBitmap(IDB_BITMAP1);
    if( i%4 == 1 )
    memBitmap.LoadBitmap(IDB_BITMAP2);
    if( i%4 == 2 )
    memBitmap.LoadBitmap(IDB_BITMAP3);
    if( i%4 == 3 )
    memBitmap.LoadBitmap(IDB_BITMAP4); pOldBmp = memDC.SelectObject(&memBitmap); memDC.BitBlt(rect.left,rect.top,128,128,
    NULL,rect.left,rect.top,SRCAND   ); pDC->BitBlt(rect.left,rect.top,128,128
    ,&memDC,0,0,SRCCOPY);
    i++; pOldBmp = memDC.SelectObject(&memBitmap); memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY); pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp);
    memDC.DeleteDC();
    memBKDC.DeleteDC();
    memBitmap.DeleteObject(); CDialog::OnTimer(nIDEvent);
    }
    如果需要添加背景,即有两个图层
    BOOL CDrawTest::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    SetTimer(1,500,NULL); return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }void CDrawTest::OnTimer(UINT nIDEvent) 
    { CRect rect; CWnd* pWnd = GetDlgItem(IDC_COORD);

    pWnd->GetClientRect(&rect);
    // 指针
    pDC = pWnd->GetDC();

        //内存绘图
        CBitmap memBitmap;
    CBitmap BKBitmap;
    CBitmap tempBitmap;

    CBitmap* pOldBmp = NULL;

    BKBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
    memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
    tempBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
    memDC.SelectObject(&tempBitmap);//这个是重点,没有这个就不能显示/*****************************************************************/

    BKBitmap.LoadBitmap(IDB_BG);
    pOldBmp = memBKDC.SelectObject(&BKBitmap);
    memDC.BitBlt(0,0,rect.right,rect.bottom,&memBKDC,0,0,SRCCOPY);
    //贴上背景 if( i%6 == 0 )
    memBitmap.LoadBitmap(IDB_BITMAP1);
    if( i%6 == 1 )
    memBitmap.LoadBitmap(IDB_BITMAP2);
    if( i%6 == 2 )
    memBitmap.LoadBitmap(IDB_BITMAP3);
    if( i%6 == 3 )
    memBitmap.LoadBitmap(IDB_BITMAP4);
    if( i%6 == 4 )
    memBitmap.LoadBitmap(IDB_BITMAP5);
    if( i%6 == 5 )
    memBitmap.LoadBitmap(IDB_BITMAP6);
    memBKDC.SelectObject(&memBitmap);

    memDC.BitBlt(0,0,128,128,&memBKDC,0,0,SRCCOPY); pDC->BitBlt(0,0,rect.right,rect.bottom,&memDC,0,0,SRCCOPY); i++;

    /****************************************************/
    memDC.SelectObject(pOldBmp);
    memDC.DeleteDC();
    memBitmap.DeleteObject();
    BKBitmap.DeleteObject(); CDialog::OnTimer(nIDEvent);
    }
    这是我用timer动画显示几张bmp的代码。
    大概原理和你的相同。用的都是DDB。
      

  2.   

    TransparentBlt,你的们图的透明色是RGB(0,0,0)?
    另:画图代码应该写在OnPaint中,不然窗口一重画就没有了。