Animation Prob

Thread Starter

zulfi100

Joined Jun 7, 2012
656
Hi,
I have developed an animation program in Visual C++ 6.0. When i excute it , it shows me the object moving but it has two problems:
i) The portions which are not filled becomes black
ii) A window is created from the right bottom of screen and slowly completely engulfs the entire screen.
The code is given below:
Rich (BB code):
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::~CAnimationCarView()
{
}

BOOL CAnimationCarView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CAnimationCarView drawing

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::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::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();

}


void CAnimationCarView::OnDraw(CDC* pDC)
{
	CAnimationCarDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
   
	CBitmap XMap,*pOldMap;
	CRect rc;
    GetClientRect(&rc);
	/*pDC->DPtoLP( rc );
    CBrush  brBackground( RGB( 255, 255, 100 ) );
    pDC->FillRect( rc, &brBackground );*/
	XMap.CreateCompatibleBitmap(pDC,rc.Width(), rc.Height());
	CDC WorkDC;
	CDC *MyDC=&WorkDC;
	MyDC->CreateCompatibleDC(pDC);
	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();
	

}


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;
}

void CAnimationCarView::OnTimer(UINT 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);
}
The header file is:

view.h
Rich (BB code):
// AnimationCarView.h : interface of the CAnimationCarView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_ANIMATIONCARVIEW_H__868E797E_E1BA_48B0_BA06_C84A7591A32B__INCLUDED_)
#define AFX_ANIMATIONCARVIEW_H__868E797E_E1BA_48B0_BA06_C84A7591A32B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


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

// Attributes
public:
	CAnimationCarDoc* GetDocument();

// Operations
public:
 void mountain(CDC*);
 void road(CDC* pDC);
 void stationary_car(CDC* pDC);
 int i,j,k,l,m,n,o,p,q,r;
 CPen penGrey, penLGrey, penBlack;
 CPen *pOldPen;
 CBrush brGrey, brLGrey, brBlack;
 CBrush* pOldBrush;
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAnimationCarView)
	public:
	virtual void OnDraw(CDC* pDC);  // overridden to draw this view
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
	protected:
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CAnimationCarView();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

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

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

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ANIMATIONCARVIEW_H__868E797E_E1BA_48B0_BA06_C84A7591A32B__INCLUDED_)

Somebody advised me:

To get rid of the flickering, handle WM_ERASEBKGND and just return TRUE in it.
To get rid of the black, you need to paint the entire memory DC in the color you want before starting to paint your road etc. You can use FillRect for this.
There is no flickering now but I dont know how to paint the memory DC. Somebody plz guide me how to solve this problem. I have attached the output of program.

Zulfi.
 

Attachments

Top