⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bounceview.cpp

📁 很好的文件
💻 CPP
字号:
// BounceView.cpp : implementation file
//

#include "stdafx.h"
#include "Mine.h"
#include "BounceView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBounceView

IMPLEMENT_DYNCREATE(CBounceView, CView)

CBounceView::CBounceView()
{

	m_bFastSpeed=false;
}

CBounceView::~CBounceView()
{
}


BEGIN_MESSAGE_MAP(CBounceView, CView)
	//{{AFX_MSG_MAP(CBounceView)
	ON_COMMAND(ID_BLUE, OnBlue)
	ON_UPDATE_COMMAND_UI(ID_BLUE, OnUpdateBlue)
	ON_COMMAND(ID_CUSTOM, OnCustom)
	ON_COMMAND(ID_GREEN, OnGreen)
	ON_UPDATE_COMMAND_UI(ID_GREEN, OnUpdateGreen)
	ON_COMMAND(ID_RED, OnRed)
	ON_UPDATE_COMMAND_UI(ID_RED, OnUpdateRed)
	ON_COMMAND(ID_WHITE, OnWhite)
	ON_UPDATE_COMMAND_UI(ID_WHITE, OnUpdateWhite)
	ON_COMMAND(ID_FAST, OnSpeedFast)
	ON_COMMAND(ID_SLOW, OnSpeedSlow)
	ON_COMMAND(ID_BLACK, OnBlack)
	ON_UPDATE_COMMAND_UI(ID_BLACK, OnUpdateBlack)
	ON_UPDATE_COMMAND_UI(ID_FAST, OnUpdateSpeedFast)
	ON_UPDATE_COMMAND_UI(ID_SLOW, OnUpdateSpeedSlow)
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_CREATE()
	ON_UPDATE_COMMAND_UI(ID_CUSTOM, OnUpdateCustom)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBounceView drawing

void CBounceView::OnDraw(CDC* pDC)
{
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	//CPen p(1,4,pDoc->m_clrBall);
	//pDC->SelectObject(p);
    //pDC->Ellipse(100,100,20,20);
	//MakeNewBall();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CBounceView diagnostics

#ifdef _DEBUG
void CBounceView::AssertValid() const
{
	CView::AssertValid();
}

void CBounceView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBounceView message handlers





CBounceDoc* CBounceView::GetDocument()
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBounceDoc)));
	return (CBounceDoc*)m_pDocument;
}

void CBounceView::OnUpdateSpeedFast(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
//	CBounceDoc* pDoc = GetDocument();
//	 ASSERT_VALID(pDoc);
	pCmdUI->SetCheck(m_bFastSpeed);
}

void CBounceView::OnUpdateSpeedSlow(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//CBounceDoc* pDoc = GetDocument();
	 //ASSERT_VALID(pDoc);
	pCmdUI->SetCheck(!m_bFastSpeed);
}
void CBounceView::OnSpeedFast() 
{
	// TODO: Add your command handler code here
//	CBounceDoc* pDoc = GetDocument();
//	ASSERT_VALID(pDoc);
	m_bFastSpeed = TRUE;
	ChangeSpeed();
//	MakeNewBall();
//	//Invalidate();
//	pDoc->UpdateAllViews(0);

}

void CBounceView::OnSpeedSlow() 
{
	// TODO: Add your command handler code here
//	CBounceDoc* pDoc = GetDocument();
//	 ASSERT_VALID(pDoc);
	m_bFastSpeed = FALSE;
	ChangeSpeed();
//	MakeNewBall();
//	//Invalidate();
//	pDoc->UpdateAllViews(0);
}
void CBounceView::ChangeSpeed()
{  
	//CBounceDoc* pDoc = GetDocument();
	//ASSERT_VALID(pDoc);
    KillTimer(1);
	if (!SetTimer(1, m_bFastSpeed ? 0 : 100, NULL))
	{
		MessageBox(_T("Not enough timers available for this window."),
				_T("MDI:Bounce"), MB_ICONEXCLAMATION | MB_OK);
		DestroyWindow();
	}
}

void CBounceView::MakeNewBall()
{
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
    pDoc->m_sizeTotal.cx = (pDoc->m_sizeRadius.cx + abs(pDoc->m_sizeMove.cx)) << 1;
	pDoc->m_sizeTotal.cy = (pDoc->m_sizeRadius.cy + abs(pDoc->m_sizeMove.cy)) << 1;

	if (pDoc->m_bmBall.m_hObject != NULL)
		pDoc->m_bmBall.DeleteObject();        // get rid of old bitmap

	CClientDC dc(this);
	CDC dcMem;
	dcMem.CreateCompatibleDC(&dc);

	pDoc->m_bmBall.CreateCompatibleBitmap(&dc, pDoc->m_sizeTotal.cx, pDoc->m_sizeTotal.cy);
	ASSERT(pDoc->m_bmBall.m_hObject != NULL);

	CBitmap* pOldBitmap = dcMem.SelectObject(&pDoc->m_bmBall);

	// draw a rectangle in the background (window) color
	CRect rect(0, 0, pDoc->m_sizeTotal.cx, pDoc->m_sizeTotal.cy);
	CBrush brBackground(::GetSysColor(COLOR_WINDOW));
	dcMem.FillRect(rect, &brBackground);

	CBrush brCross(HS_DIAGCROSS, 0L);
	CBrush* pOldBrush = dcMem.SelectObject(&brCross);

	dcMem.SetBkColor(pDoc->m_clrBall);
	dcMem.Ellipse(abs(pDoc->m_sizeMove.cx), abs(pDoc->m_sizeMove.cy),
		pDoc->m_sizeTotal.cx - abs(pDoc->m_sizeMove.cx),
		pDoc->m_sizeTotal.cy - abs(pDoc->m_sizeMove.cy));

	dcMem.SelectObject(pOldBrush);
	dcMem.SelectObject(pOldBitmap);
	
	dcMem.DeleteDC();
}

void CBounceView::OnSize(UINT nType, int cx, int cy) 
{
	
	
	// TODO: Add your message handler code here
	CBounceDoc* pDoc = GetDocument();
	 ASSERT_VALID(pDoc);
	LONG lScale;
    pDoc->m_ptPixel=m_ptPixel;  
	pDoc->m_ptCenter.x = cx >> 1;
	pDoc->m_ptCenter.y = cy >> 1;
	pDoc->m_ptCenter.x += cx >> 3; // make the ball a little off-center

	lScale = min((LONG)cx * pDoc->m_ptPixel.x,
		(LONG)cy * pDoc->m_ptPixel.y) >> 4;
	pDoc->m_sizeRadius.cx = (int)(lScale / pDoc->m_ptPixel.x);
	pDoc->m_sizeRadius.cy = (int)(lScale / pDoc->m_ptPixel.y);
	pDoc->m_sizeMove.cx = max(1, pDoc->m_sizeRadius.cy >> 2);
	pDoc->m_sizeMove.cy = max(1, pDoc->m_sizeRadius.cy >> 2);

	MakeNewBall();
	ChangeSpeed();
    CView::OnSize(nType, cx, cy);
	 
}

void CBounceView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CBounceDoc* pDoc = GetDocument();
	 ASSERT_VALID(pDoc);
	if (pDoc->m_bmBall.m_hObject == NULL)
		return;     // no bitmap for the ball

	CRect rcClient;
	GetClientRect(rcClient);

	CClientDC dc(this);
	CBitmap* pbmOld = NULL;

	CDC dcMem;
	dcMem.CreateCompatibleDC(&dc);
	pbmOld = dcMem.SelectObject(&pDoc->m_bmBall);

	dc.BitBlt(pDoc->m_ptCenter.x - pDoc->m_sizeTotal.cx / 2,
			pDoc->m_ptCenter.y - pDoc->m_sizeTotal.cy / 2,
			pDoc->m_sizeTotal.cx, pDoc->m_sizeTotal.cy,
			&dcMem, 0, 0, SRCCOPY);

	pDoc->m_ptCenter += pDoc->m_sizeMove;

	if ((pDoc->m_ptCenter.x + pDoc->m_sizeRadius.cx >= rcClient.right) ||
		(pDoc->m_ptCenter.x - pDoc->m_sizeRadius.cx <= 0))
	{
		pDoc->m_sizeMove.cx = -pDoc->m_sizeMove.cx;
	}

	if ((pDoc->m_ptCenter.y + pDoc->m_sizeRadius.cy >= rcClient.bottom) ||
		(pDoc->m_ptCenter.y - pDoc->m_sizeRadius.cy <= 0))
	{
		pDoc->m_sizeMove.cy = -pDoc->m_sizeMove.cy;
	}

	dcMem.SelectObject(pbmOld);
	dcMem.DeleteDC();
	
	CView::OnTimer(nIDEvent);
}

void CBounceView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	
}

BOOL CBounceView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CView::PreCreateWindow(cs);
}

int CBounceView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	//CBounceDoc* pDoc = GetDocument();
	 //ASSERT_VALID(pDoc);
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	CDC* pDC = GetDC();
	m_ptPixel.x = pDC->GetDeviceCaps(ASPECTX);
	m_ptPixel.y = pDC->GetDeviceCaps(ASPECTY);
	ReleaseDC(pDC);
	return 0;
}

void CBounceView::OnBlack() 
{
	// TODO: Add your command handler code here
    
		CBounceDoc* pDoc = GetDocument();
	    ASSERT_VALID(pDoc);
        BOOL x = pDoc->m_bBlack;
		if ( x == 0 )
		{
			pDoc->m_bWhite = 0;
			pDoc->m_bBlack = 1;
			pDoc->m_clrBall = RGB(0,0,0);
		}
 		pDoc->m_bBlue = 0;
		pDoc->m_bGreen = 0;
		pDoc->m_bRed = 0;
		pDoc->m_bCustom = 0; 
        MakeNewBall();
		Invalidate();

}

void CBounceView::OnUpdateBlack(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bBlack == 1) 
       pCmdUI->SetCheck(1); 
    else
	   pCmdUI->SetCheck(0);	
}

void CBounceView::OnBlue() 
{
	// TODO: Add your command handler code here

		CBounceDoc* pDoc = GetDocument();
	    ASSERT_VALID(pDoc);
		pDoc->m_bBlue = !pDoc->m_bBlue ;
		pDoc->m_bCustom = 0; 
		MixColors();
		MakeNewBall();
	    Invalidate();

}

void CBounceView::OnUpdateBlue(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bBlue == 1) 
       pCmdUI->SetCheck(1); 
    else
	   pCmdUI->SetCheck(0);	
}

void CBounceView::OnCustom() 
{
	// TODO: Add your command handler code here
		CBounceDoc* pDoc = GetDocument();
	    ASSERT_VALID(pDoc);
		CColorDialog color(pDoc->m_clrBall);
		if (color.DoModal()==IDOK)
		{ 
		pDoc->m_clrBall = color.GetColor();
		pDoc->m_bCustom = 1;
   	    pDoc->m_bBlue = 0;
	    pDoc->m_bGreen = 0;
	    pDoc->m_bRed = 0;
	    pDoc->m_bWhite = 0; 
	    pDoc->m_bBlack = 0;

		}

        MakeNewBall();
		Invalidate();
}

void CBounceView::OnUpdateCustom(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bCustom == 1) 
       pCmdUI->SetCheck(1); 
    else
	   pCmdUI->SetCheck(0);
}

void CBounceView::OnGreen() 
{
	// TODO: Add your command handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    pDoc->m_bGreen = !pDoc->m_bGreen;
	pDoc->m_bCustom = 0; 
	MixColors();
	MakeNewBall();
	Invalidate();
}

void CBounceView::OnUpdateGreen(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bGreen == 1) 
       pCmdUI->SetCheck(1); 
    else
	   pCmdUI->SetCheck(0);
}

void CBounceView::OnRed() 
{
	// TODO: Add your command handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    pDoc->m_bRed = !pDoc->m_bRed;
	pDoc->m_bCustom = 0; 
	MixColors();
	MakeNewBall();
	Invalidate();
}

void CBounceView::OnUpdateRed(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bRed == 1) 
       pCmdUI->SetCheck(1); 
    else
	   pCmdUI->SetCheck(0); 

}

void CBounceView::OnWhite() 
{
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    BOOL x ;
	x= pDoc->m_bWhite ;

	if( x == 0)
	{
		pDoc->m_bWhite = 1 ;
		pDoc->m_bBlack = 0;
		pDoc->m_clrBall = RGB(255,255,255);
	}

	pDoc->m_bBlue = 0;
	pDoc->m_bGreen = 0;
	pDoc->m_bRed = 0;
	pDoc->m_bCustom = 0; 
    MakeNewBall();
	Invalidate();
}

void CBounceView::OnUpdateWhite(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bWhite == 1) 
       pCmdUI->SetCheck(1); 
    else
	   pCmdUI->SetCheck(0); 
}

void CBounceView::MixColors()
{

	CBounceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->m_bBlue ==1 && pDoc->m_bGreen ==1 && pDoc->m_bRed == 1)
    {
		pDoc->m_bBlack = 0;
		pDoc->m_bWhite = 1;
	}
	else if (pDoc->m_bBlue ==0 && pDoc->m_bGreen ==0 && pDoc->m_bRed == 0)
    {
		pDoc->m_bBlack = 1;
		pDoc->m_bWhite = 0;
	}
	else 
	{
		pDoc->m_bBlack = 0;
		pDoc->m_bWhite = 0;
	}

	int x,y,z;
	if (pDoc->m_bWhite == 1)
	{	x = 255; y = 255; z = 255; }
	else if (pDoc->m_bBlack == 1)
	{ x = 0 ; y = 0 ; z = 0 ; }
	else
	{
	if (pDoc->m_bRed == 1)
		x = 255;
    else 
		x = 0 ;
	if (pDoc->m_bGreen == 1)
		y = 255;
    else
		y = 0;
	if (pDoc->m_bBlue == 1)
		z = 255;
	else
	 	z = 0;
    }
	if ( pDoc->m_bCustom == 0)  pDoc->m_clrBall = RGB(x,y,z);
	MakeNewBall();
	pDoc->UpdateAllViews(0);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -