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

📄 bounceview.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 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 + -