有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()不行?
{
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()不行?
{
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。
另:画图代码应该写在OnPaint中,不然窗口一重画就没有了。