Click here to Skip to main content
15,893,564 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
CSS
Hi,
I have written a code to perform animation using Visual Studio 2008. It has got mountains, a road and a car. The car has to travel on the road. But when i execute the program a grey window slowly captures my screen. Due to large size i am skipping the default code.
The *view.cpp file is:

C++
// AnimationCarView.cpp : implementation of the CAnimationCarView class
//



// CAnimationCarView

IMPLEMENT_DYNCREATE(CAnimationCarView, CView)

BEGIN_MESSAGE_MAP(CAnimationCarView, CView)
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	ON_WM_CREATE()
END_MESSAGE_MAP()

// CAnimationCarView construction/destruction

CAnimationCarView::CAnimationCarView()
{
	// TODO: add construction code here
    i=150,j=190,k=145,l=140,m=138,n=195,o=197,p=170,q=148,r=185;
	penGrey.CreatePen(PS_SOLID, 5, RGB(128,128,128));//GREY color
	penLGrey.CreatePen(PS_SOLID,5, RGB(220,220,220));//LGREY color
	penBlack.CreatePen(PS_SOLID, 5, RGB(0,0,0));
	pOldPen=NULL;
	brGrey.CreateSolidBrush(RGB(128, 128, 128));
	brLGrey.CreateSolidBrush(RGB(220,220,220));
	brBlack.CreateSolidBrush(RGB(0, 0, 0));
	pOldBrush=NULL;
	
}




// CAnimationCarView drawing

void CAnimationCarView::OnDraw(CDC* pDC)
{
	CAnimationCarDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
CBitmap XMap,*pOldMap;
	CRect rc;
    GetClientRect(&rc);
	//pDC->DPtoLP( rc );
    CBrush  brBackground( RGB( 255, 255, 255 ) );
    //pDC->FillRect( rc, &brBackground );
	XMap.CreateCompatibleBitmap(pDC,rc.Width(), rc.Height());
	CDC WorkDC;
	CDC *MyDC=&WorkDC;
	MyDC->CreateCompatibleDC(pDC);
	MyDC->FillRect(rc, &brBackground);
	pOldMap=MyDC->SelectObject(&XMap);
	road(MyDC);
	mountain(MyDC);
	stationary_car(MyDC);
	pDC->BitBlt(0, 0, rc.Width(), rc.Height(), MyDC, 0, 0, SRCCOPY);
	MyDC->SelectObject(pOldMap);
	
	XMap.DeleteObject();
	MyDC->DeleteDC();

	// TODO: add draw code for native data here
}

void CAnimationCarView::mountain(CDC* pDC)
{
	//setcolor(BROWN);
	CPen penBrown(PS_SOLID, 5, RGB(150,75,0));
	CPen* pOldPen=NULL;
	pOldPen=pDC->SelectObject(&penBrown);
	//line(0,250,700,250);
	pDC->MoveTo(0,250);
	pDC->LineTo(700,250);
	//line(0,250,0,160);
	pDC->MoveTo(0,250);
	pDC->LineTo(0,160);
	//line(0,160,30,200);
	pDC->MoveTo(0,160);
	pDC->LineTo(30,200);
	//line(30,200,80,120);
	pDC->MoveTo(30,200);
	pDC->LineTo(80,120);
    //arc(90,124,30,150,10);
	pDC->AngleArc(90,124,10,30,150);
	//line(99,119,150,180);
	pDC->MoveTo(99,119);
	pDC->LineTo(150,180);
	//line(150,180,220,100);
	pDC->MoveTo(150,180);
	pDC->LineTo(220,100);
	//arc(234,106,30,150,15);
	pDC->AngleArc(234,106,15,30,150);
	//line(248,99,320,200);
	pDC->MoveTo(248,99);
	pDC->LineTo(320,200);
	//line(320,200,370,125);
	pDC->MoveTo(320,200);
	pDC->LineTo(370,125);
	//arc(380,129,30,150,10);
	pDC->AngleArc(380,129,10,30,150);
	//line(389,124,430,180);
	pDC->MoveTo(389,124);
	pDC->LineTo(430,180);
	//line(430,180,505,90);
	pDC->MoveTo(430,180);
	pDC->LineTo(505,90);
	//arc(519,96,30,150,15);
	pDC->AngleArc(519,96,15,30,150);
	//line(533,89,605,200);
	pDC->MoveTo(533,89);
	pDC->LineTo(605,200);
	//line(605,200,700,110);
	pDC->MoveTo(605,200);
	pDC->LineTo(700,170);
	//line(700,170,700,250);
	pDC->MoveTo(700,170);
	pDC->LineTo(700,250);
	CBrush brBrown(RGB(150, 75, 0));
	CBrush* pOldBrush=NULL;
	pOldBrush=pDC->SelectObject(&brBrown);
	pDC->FloodFill(10,245,RGB(150,75,0));
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
	
}

void CAnimationCarView::road(CDC* pDC){ 
	CPoint poly6[8]={CPoint(0,400), CPoint(210,400),CPoint(210,440),CPoint(0,440)};
	CPen pen(PS_SOLID, 5, RGB(220,220,220));
	CPen* pOldPen=NULL;
	pOldPen=pDC->SelectObject(&pen);
	CBrush br(RGB(220, 220, 220));
	CBrush* pOldBrush=NULL;
	pOldBrush=pDC->SelectObject(&br);
	pDC->Polygon(poly6, 4);
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
	}


void CAnimationCarView::stationary_car(CDC* pDC)
{
	//int i=150,j=190,k=145,l=140,m=138,n=195,o=197,p=170,q=148,r=185;
	//CPen penGrey(PS_SOLID, 5, RGB(128,128,128));//GREY color
	CBitmap XMap,*pOldMap;
	CPen* pOldPen=NULL;
	pOldPen=pDC->SelectObject(&penGrey);
	SIZE Size;
    Size.cx = GetSystemMetrics(SM_CXSCREEN);
    Size.cy = GetSystemMetrics(SM_CYSCREEN);
	XMap.CreateCompatibleBitmap(pDC,Size.cx,Size.cy);
	CDC WorkDC;
	CDC *MyDC=&WorkDC;
	MyDC->CreateCompatibleDC(pDC);
	pOldMap=MyDC->SelectObject(&XMap);
	//line(i,402,j,402);
	MyDC->MoveTo(i,402);
	MyDC->LineTo(j,402);
	//line(j,415,k,415);
	MyDC->MoveTo(j,415);
	MyDC->LineTo(k,415);
	//line(j,402,j,415);
	MyDC->MoveTo(j,402);
	MyDC->LineTo(j,415);
	//line(k,415,i,402);
	MyDC->MoveTo(k,415);
	MyDC->LineTo(i,402);
	//setfillstyle(SOLID_FILL,6);
	//CBrush brGrey(RGB(128, 128, 128));
	CBrush* pOldBrush=NULL;
	//floodfill(p,408,6);
	//NOTE IF FloodFill done after select object, color mixing would occur 
	pOldBrush=MyDC->SelectObject(&brGrey);
	MyDC->FloodFill(p,408,RGB(128,128,128));
	//line(n,415,o,428);
	MyDC->MoveTo(n,415);
	MyDC->LineTo(o,428);
	//line(l,415,m,428);
	MyDC->MoveTo(l,415);
	MyDC->LineTo(m,428);
	//line(l,415,n,415);
	MyDC->MoveTo(l,415);
	MyDC->LineTo(n,415);
	//line(o,428,m,428);
	MyDC->MoveTo(o,428);
	MyDC->LineTo(m,428);
	//setfillstyle(SOLID_FILL,6);
	//floodfill(p,422,6);
	MyDC->FloodFill(p,422,RGB(128,128,128));
	MyDC->SelectObject(pOldBrush);
	MyDC->SelectObject(pOldPen);
	//Drawing wheels
	//circle(q,434,5);
	CBrush brBlack(RGB(0, 0, 0));
	pOldBrush=NULL;
	pOldBrush=MyDC->SelectObject(&brBlack);
	//CPen penBlack(PS_SOLID, 5, RGB(0,0,0));//Black color
	pOldPen=NULL;
	pOldPen=MyDC->SelectObject(&penBlack);
	MyDC->MoveTo(r,434);
	MyDC->AngleArc(q,434,5,0,360);
	MyDC->FloodFill(q,434,RGB(0,0,0));
	//circle(r,434,5);
	MyDC->AngleArc(r,434,5,0,360);
	pDC->BitBlt(j,k,Size.cx,Size.cy,MyDC,0,0,SRCCOPY);
	MyDC->SelectObject(pOldPen);
	MyDC->SelectObject(pOldBrush);
	MyDC->SelectObject(pOldMap);
	XMap.DeleteObject();
	MyDC->DeleteDC();

}











// CAnimationCarView message handlers

void CAnimationCarView::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
    if(i>0){
	i=i-3;
	Invalidate();
	j=j-3;k=k-3;l=l-3;m=m-3;n=n-3;o=o-3;p=p-3;q=q-3;r=r-3;
	}
	CView::OnTimer(nIDEvent);
}

BOOL CAnimationCarView::OnEraseBkgnd(CDC* pDC)
{
	// TODO: Add your message handler code here and/or call default
    return TRUE;
	return CView::OnEraseBkgnd(pDC);
}

int CAnimationCarView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	SetTimer(1,200,NULL);

	// TODO:  Add your specialized creation code here

	return 0;
}


The header file is:

C++
// AnimationCarView.h : interface of the CAnimationCarView class
//


#pragma once


class CAnimationCarView : public CView
{
protected: // create from serialization only
	CAnimationCarView();
	DECLARE_DYNCREATE(CAnimationCarView)

// Attributes
public:
	CAnimationCarDoc* GetDocument() const;
    int i,j,k,l,m,n,o,p,q,r;
   CPen penGrey, penLGrey, penBlack;
   CPen *pOldPen;
    CBrush brGrey, brLGrey, brBlack;
    CBrush* pOldBrush;
// Operations
public:
	void mountain(CDC*);
   void road(CDC*);
   void   stationary_car(CDC*);
// Overrides
public:
	virtual void OnDraw(CDC* pDC);  // overridden to draw this view
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// Implementation


// Generated message map functions
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};

#ifndef _DEBUG  // debug version in AnimationCarView.cpp
inline CAnimationCarDoc* CAnimationCarView::GetDocument() const
   { return reinterpret_cast<CAnimationCarDoc*>(m_pDocument); }
#endif



Somebody plz guide me.

Zulf.
Posted
Comments
Sergey Alexandrovich Kryukov 26-Feb-14 0:30am    
Sorry, it's hard to understand your description of the problem...
—SA

1 solution

Hi,
I am using double buffering to achieve animation. I want to animate a car.
I have received following advise from one another forum
You create two bitmaps of the same size and bitdepth
one holds the active/visible frame


one holds the new frame you're working on

your OnPaint only blits the invalidated rect from the visible bitmap to the screen.

When your new frame is finished, you flip the pointers/handles to the 2 bitmaps so the "new frame" becomes the visible frame, and the previously visible frame now becomes the new frame bitmap you'll be working on.
Invalidate the entire screen, OnPaint will do the rest
Repeat above 3 steps until whatever end condition is reached.

but i dont know how to implement it. Kindly guide me.

Zulfi.
 
Share this answer
 
Comments
CPallini 27-Feb-14 3:27am    
That is in order to avoid flickering, but it does not solve your original problem, in my opinion .
Please modify your original post instead to add new info as solutions.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900