학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

배경과 함성된 애니메이션

학습목표

배경과 합성된 애니메이션 프로그램을 만든다.

학습주제

 

예습내용

 

실습방법

   

1.        배경 그림은 리소스에 추가한다. [그림 내려받기]

그림의 ID “IDB_BACK” 한다.

2.        OnDraw 함수에 배경을 그리는 함수를 추가한다.

 

void CBMPView::OnDraw(CDC* pDC)

{

              CBitmap bmpBack;

              bmpBack.LoadBitmap(IDB_BACK);

 

              CDC MemDC;

              MemDC.CreateCompatibleDC(pDC);

 

              CBitmap *pOldBitmap = (CBitmap *)MemDC.SelectObject(&bmpBack);

              MemDC.SelectObject(&bmpBack);

 

              pDC->BitBlt(0, 0, 256, 192, &MemDC, 0, 0, SRCCOPY);

              MemDC.SelectObject(pOldBitmap);

 

              DrawBitmap();

}

 

여기까지 프로그램을 실행하면 아래 그림과 같이 그림이 자연스럽지않다. 다음은 이를 수정하는 프로그램을 만든다.

 

3.        마스크 비트맵을 만든다.

 

마스크는 그림 부분만 검정색(비트0)이다. 이는 다른 그림과 AND 연산을 하여도 0 되어 검정색이 되고 하얀 부분(비트1) AND 연산을 해도 그대로 출력된다. 그러므로 배경은 AND 연산을 하고 아이콘은 OR 연산을 하면 배경과 아이콘을 그대로 살릴 있다.

DrawBitmap 함수를 아래와 같이 수정한다.

 

void CBMPView::DrawBitmap()

{

              static int nAnimate;

              CClientDC dc(this);

 

              // 호환성 있는 메모리 DC 생성

              CDC MemDC;

              MemDC.CreateCompatibleDC(&dc);

 

              // 리소스에서 비트맵 읽기

              CBitmap bmpMask, bmpMan, bmpBack;

              bmpMask.LoadBitmap(IDB_MASK);

              bmpMan.LoadBitmap(IDB_MAN);

              bmpBack.LoadBitmap(IDB_BACK);

 

              // 배경 다시 그리기

              CBitmap *pOldBitmap = (CBitmap *)MemDC.SelectObject(&bmpBack);

              dc.BitBlt(50, 50, 32, 32, &MemDC, 50, 50, SRCCOPY);

 

              // 마스크 그리기

              MemDC.SelectObject(&bmpMask);

              dc.BitBlt(50, 50, 32, 32, &MemDC, 32*nAnimate, 0, SRCAND);

 

              // 아이콘 그림 그리기

              MemDC.SelectObject(&bmpMan);

              dc.BitBlt(50, 50, 32, 32, &MemDC, 32*nAnimate, 0, SRCPAINT);

 

              // 애니메이션 카운터를 증가시킴

              if(++nAnimate > 3) nAnimate = 0;

 

              MemDC.SelectObject(pOldBitmap);

}

 

 

처음

   

1.        프로그램에서 동영상의 좌표를 변화시켜 동작시켜 보자

헤더 파일에 다음 변수를 추가 시킨다.

 

public:

              int xLoc,yLoc;

              void DrawBitmap();

              virtual ~CBMPView();

 

다음의 함수를 수정한다.

 

void CBMPView::DrawBitmap()

{

              static int nAnimate;

              CClientDC dc(this);

 

              // 호환성 있는 메모리 DC 생성

              CDC MemDC;

              MemDC.CreateCompatibleDC(&dc);

 

              // 리소스에서 비트맵 읽기

              CBitmap bmpMask, bmpMan, bmpBack;

              bmpMask.LoadBitmap(IDB_MASK);

              bmpMan.LoadBitmap(IDB_MAN);

              bmpBack.LoadBitmap(IDB_BACK);

 

              // 그림의 좌표값을 xLoc,yLoc 하고 값을 변화 시킨다.

              xLoc--;

              yLoc--;

              if(xLoc<=0)

                             xLoc=150;

              if(yLoc<=0)

                             yLoc=150;

 

              // 배경 다시 그리기

              CBitmap *pOldBitmap = (CBitmap *)MemDC.SelectObject(&bmpBack);

              //dc.BitBlt(xLoc, yLoc, 32, 32, &MemDC, 50, 50, SRCCOPY);

              dc.BitBlt(0, 0, 256, 192, &MemDC, 0, 0, SRCCOPY);

 

              // 마스크 그리기

              MemDC.SelectObject(&bmpMask);

              dc.BitBlt(xLoc, yLoc, 32, 32, &MemDC, 32*nAnimate, 0, SRCAND);

 

              // 아이콘 그림 그리기

              MemDC.SelectObject(&bmpMan);

              dc.BitBlt(xLoc, yLoc, 32, 32, &MemDC, 32*nAnimate, 0, SRCPAINT);

 

              // 애니메이션 카운터를 증가시킴

              if(++nAnimate > 3) nAnimate = 0;

 

              MemDC.SelectObject(pOldBitmap);

}

 

void CBMPView::OnInitialUpdate()

{

              CView::OnInitialUpdate();

             

              // TODO: Add your specialized code here and/or call the base class

              SetTimer(0,200,NULL);

              xLoc=150;

              yLoc=150;

}

 

[전체프로그램 내려받기]

2.        과제1 동작은 좌측으로 움직이나 이번에는 우측으로 이동하는 프로그램을 만들어 본다. 이는 StretchBlt 함수를 사용하여 그림을 x축으로 회전 시켜 그림을 이동 시킨다. 과제1 프로그램에서 아래 함수와 좌표를 변화시키면 된다.

 

void CBMPView::DrawBitmap()

{

              static int nAnimate;

              CClientDC dc(this);

 

              // 호환성 있는 메모리 DC 생성

              CDC MemDC;

              MemDC.CreateCompatibleDC(&dc);

 

              // 리소스에서 비트맵 읽기

              CBitmap bmpMask, bmpMan, bmpBack;

              bmpMask.LoadBitmap(IDB_MASK);

              bmpMan.LoadBitmap(IDB_MAN);

              bmpBack.LoadBitmap(IDB_BACK);

 

              // 그림의 좌표값을 xLoc,yLoc 하고 값을 변화 시킨다.

              xLoc++;

              yLoc--;

              if(xLoc>=150)

                             xLoc=0;

              if(yLoc<=0)

                             yLoc=150;

 

              // 배경 다시 그리기

              CBitmap *pOldBitmap = (CBitmap *)MemDC.SelectObject(&bmpBack);

              dc.BitBlt(0, 0, 256, 192, &MemDC, 0, 0, SRCCOPY);

 

              // 마스크 그리기

              MemDC.SelectObject(&bmpMask);

              dc.StretchBlt(xLoc, yLoc, 32, 32, &MemDC, 32*(1+nAnimate), 0, -32, 32, SRCAND);

             

              // 아이콘 그림 그리기

              MemDC.SelectObject(&bmpMan);

              dc.StretchBlt(xLoc, yLoc, 32, 32, &MemDC, 32*(1+nAnimate), 0, -32, 32, SRCPAINT);

             

              // 애니메이션 카운터를 증가시킴

              if(++nAnimate > 3) nAnimate = 0;

 

              MemDC.SelectObject(pOldBitmap);

}

 

void CBMPView::OnInitialUpdate()

{

              CView::OnInitialUpdate();

             

              // TODO: Add your specialized code here and/or call the base class

              SetTimer(0,100,NULL);

              xLoc=0;

              yLoc=150;

}

 

 

3.        과제1 과제2 합성하여 좌우로 움직이는 에니메이션을 만드시오

4.        “과제1”을 WorkLeft() “과제2”를 WorkRight()  함수로 만들고 마우스 오른쪽 버튼을 누르면 좌로이동하고, 왼쪽 버튼을 누르면 우로 이동하는 프로그램을 만드시오.

아래 그림과 같이 선택하여 OnLButtonDown  OnRButtonDown 두개의 함수를 만든다.

 

int nModeWork; 선언하고 OnInitialUpdate() 함수에 초기치를 0”으로 한다.

OnLButtonDown”함수에 nModeWork=1, OnRButtonDown”함수에 nModeWork=2 한다.

 1”일 WorkLeft() 프로그램을 2”일 WorkRight() 프로그램이 타이머 함수에서 동작 하도록 한다.

   [전체프로그램 내려받기]

중요함수