📄 bounceview.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 + -