📄 bounceview.cpp
字号:
// BounceView.cpp : implementation file
//
#include "stdafx.h"
#include "MThread.h"
#include "BounceView.h"
#include "BounceFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define ABS(x) ((x)<0?-(x):(x)>0?(x):0)
// CBounceView
CBounceView::CBounceView()
{
m_ColorBall=RGB(0,0,0);
m_bFastSpeed=FALSE;
}
CBounceView::~CBounceView()
{
}
BEGIN_MESSAGE_MAP(CBounceView, CWnd)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_COLOR_BLACK, OnColorBlack)
ON_UPDATE_COMMAND_UI(ID_COLOR_BLACK, OnUpdateColorBlack)
ON_COMMAND(ID_COLOR_BLUE, OnColorBlue)
ON_UPDATE_COMMAND_UI(ID_COLOR_BLUE, OnUpdateColorBlue)
ON_COMMAND(ID_COLOR_GREEN, OnColorGreen)
ON_UPDATE_COMMAND_UI(ID_COLOR_GREEN, OnUpdateColorGreen)
ON_COMMAND(ID_COLOR_RED, OnColorRed)
ON_UPDATE_COMMAND_UI(ID_COLOR_RED, OnUpdateColorRed)
ON_COMMAND(ID_COLOR_WHITE, OnColorWhite)
ON_UPDATE_COMMAND_UI(ID_COLOR_WHITE, OnUpdateColorWhite)
ON_COMMAND(ID_SPEED_FAST, OnSpeedFast)
ON_UPDATE_COMMAND_UI(ID_SPEED_FAST, OnUpdateSpeedFast)
ON_COMMAND(ID_SPEED_SLOW, OnSpeedSlow)
ON_UPDATE_COMMAND_UI(ID_SPEED_SLOW, OnUpdateSpeedSlow)
ON_MESSAGE(WM_USER_ONCMDMSG,OnDelegatedCmdMsg)
ON_MESSAGE(WM_USER_PREPARE_TO_CLOSE,OnPrepareToClose)
END_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(CBounceView,CWnd)
// CBounceView message handlers
BOOL CBounceView::Create(LPCTSTR szTitle, LONG style, const RECT& rect, CWnd* pParent)
{
// TODO: Add your specialized code here and/or call the base class
LPCTSTR lpszBounceClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
LoadCursor(NULL,IDC_UPARROW),(HBRUSH)(COLOR_WINDOW+1),NULL);
return CWnd::Create(lpszBounceClass, szTitle, style, rect, pParent,IDC_BOUNCE_VIEW);
}
int CBounceView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(!SetTimer(1,100,NULL))
{
MessageBox(_T("Not enough timers available for this window."),_T("MDI:Bounce"),MB_ICONEXCLAMATION|MB_OK);
return -1;
}
CDC * pDC=GetDC();
m_ptPixel.x=pDC->GetDeviceCaps(ASPECTX);
m_ptPixel.y=pDC->GetDeviceCaps(ASPECTY);
ReleaseDC(pDC);
return 0;
}
void CBounceView::OnSize(UINT nType, int cx, int cy)
{
LONG lScale;
m_ptCenter.x=cx>>1;
m_ptCenter.y=cy>>1;
m_ptCenter.x+=cx>>3;
lScale=min((LONG)cx*m_ptPixel.x,(LONG)cy*m_ptPixel.y)>>4;
m_sizeRadius.cx=(int)(lScale/m_ptPixel.x);
m_sizeRadius.cy=(int)(lScale/m_ptPixel.y);
m_sizeMove.cx=max(1,m_sizeRadius.cy>>2);
m_sizeMove.cy=max(1,m_sizeRadius.cy>>2);
MakeNewBall();
CWnd::OnSize(nType, cx, cy);
}
void CBounceView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(m_bmBall.m_hObject==NULL)
return;
CRect rcClient;
GetClientRect(rcClient);
CClientDC dc(this);
CBitmap *pbmOld=NULL;
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
pbmOld=dcMem.SelectObject(&m_bmBall);
dc.BitBlt(m_ptCenter.x-m_sizeTotal.cx/2,
m_ptCenter.y-m_sizeTotal.cy/2,
m_sizeTotal.cx,m_sizeTotal.cy,
&dcMem,0,0,SRCCOPY);
m_ptCenter+=m_sizeMove;
if((m_ptCenter.x+m_sizeRadius.cx>=rcClient.right)||(m_ptCenter.x-m_sizeRadius.cx<=0))
m_sizeMove.cx=-m_sizeMove.cx;
if((m_ptCenter.y+m_sizeRadius.cy>=rcClient.bottom)||(m_ptCenter.y-m_sizeRadius.cy<=0))
m_sizeMove.cy=-m_sizeMove.cy;
dcMem.SelectObject(pbmOld);
dcMem.DeleteDC();
}
void CBounceView::OnDestroy()
{
CWnd::OnDestroy();
// TODO: Add your message handler code here
}
void CBounceView::OnLButtonDown(UINT nFlags, CPoint point)
{
Invalidate();
CRect rcClient;
GetClientRect(rcClient);
point.x=min(point.x,rcClient.right-2*m_sizeRadius.cx);
point.x=max(point.x,2*m_sizeRadius.cx);
point.y=min(point.y,rcClient.bottom-2*m_sizeRadius.cy);
point.y=max(point.y,2*m_sizeRadius.cy);
m_ptCenter=point;
}
void CBounceView::MakeNewBall()
{
m_sizeTotal.cx=(m_sizeRadius.cx+ABS(m_sizeMove.cx))<<1;
m_sizeTotal.cy=(m_sizeRadius.cy+ABS(m_sizeMove.cy))<<1;
if(m_bmBall.m_hObject!=NULL)
m_bmBall.DeleteObject();
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
m_bmBall.CreateCompatibleBitmap(&dc,m_sizeTotal.cx,m_sizeTotal.cy);
ASSERT(m_bmBall.m_hObject!=NULL);
CBitmap *pOldBitmap=dcMem.SelectObject(&m_bmBall);
CRect rect(0,0,m_sizeTotal.cx,m_sizeTotal.cy);
CBrush brBackground(::GetSysColor(COLOR_WINDOW));
dcMem.FillRect(rect,&brBackground);
CBrush brCross(HS_DIAGCROSS,0L);
CBrush* pOldBrush = dcMem.SelectObject(&brCross);
dcMem.SetBkColor(m_ColorBall);
dcMem.Ellipse(ABS(m_sizeMove.cx), ABS(m_sizeMove.cy),
m_sizeTotal.cx - ABS(m_sizeMove.cx),
m_sizeTotal.cy - ABS(m_sizeMove.cy));
dcMem.SelectObject(pOldBrush);
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();
}
LRESULT CBounceView::OnDelegatedCmdMsg(WPARAM,LPARAM lParam)
{
COnCmdMsg *pOnCmdMsg=(COnCmdMsg *)lParam;
return CWnd::OnCmdMsg(pOnCmdMsg->m_nID,pOnCmdMsg->m_nCode,
pOnCmdMsg->m_pExtra,pOnCmdMsg->m_pHandlerInfo);
}
LRESULT CBounceView::OnPrepareToClose(WPARAM,LPARAM)
{
DestroyWindow();
return 0;
}
void CBounceView::OnColorBlack()
{
// TODO: Add your command handler code here
m_ColorBall=RGB(0,0,0);
MakeNewBall();
Invalidate();
}
void CBounceView::OnUpdateColorBlack(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_ColorBall==RGB(0,0,0));
}
void CBounceView::OnColorBlue()
{
// TODO: Add your command handler code here
m_ColorBall=RGB(0,0,255);
MakeNewBall();
Invalidate();
}
void CBounceView::OnUpdateColorBlue(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_ColorBall==RGB(0,0,255));
}
void CBounceView::OnColorGreen()
{
// TODO: Add your command handler code here
m_ColorBall=RGB(0,255,0);
MakeNewBall();
Invalidate();
}
void CBounceView::OnUpdateColorGreen(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_ColorBall==RGB(0,255,0));
}
void CBounceView::OnColorRed()
{
// TODO: Add your command handler code here
m_ColorBall=RGB(255,0,0);
MakeNewBall();
Invalidate();
}
void CBounceView::OnUpdateColorRed(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_ColorBall==RGB(255,0,0));
}
void CBounceView::OnColorWhite()
{
// TODO: Add your command handler code here
m_ColorBall=RGB(255,255,255);
MakeNewBall();
Invalidate();
}
void CBounceView::OnUpdateColorWhite(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_ColorBall==RGB(255,255,255));
}
void CBounceView::OnSpeedFast()
{
// TODO: Add your command handler code here
m_bFastSpeed=TRUE;
KillTimer(1);
if(!SetTimer(1,0,NULL))
{
MessageBox(_T("Not enough timers available for this window."),
_T("MDI:Bounce"),MB_ICONEXCLAMATION|MB_OK);
DestroyWindow();
}
}
void CBounceView::OnUpdateSpeedFast(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bFastSpeed);
}
void CBounceView::OnSpeedSlow()
{
// TODO: Add your command handler code here
m_bFastSpeed=FALSE;
KillTimer(1);
if(!SetTimer(1,100,NULL))
{
MessageBox(_T("Not enough timers available for this window."),
_T("MDI:Bounce"),MB_ICONEXCLAMATION|MB_OK);
DestroyWindow();
}
}
void CBounceView::OnUpdateSpeedSlow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(!m_bFastSpeed);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -