www.gusucode.com > VC++动画启动软件及文字特效源码程序 > VC++动画启动软件及文字特效源码程序\code\MyTextView.cpp

    // MyTextView.cpp : implementation of the CMyTextView class
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "MyText.h"

#include "MyTextDoc.h"
#include "MyTextView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyTextView

IMPLEMENT_DYNCREATE(CMyTextView, CView)

BEGIN_MESSAGE_MAP(CMyTextView, CView)
	//{{AFX_MSG_MAP(CMyTextView)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_COMMAND(ID_TING, OnTing)
	ON_COMMAND(ID_KAISHI, OnKaishi)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_REN, OnRen)
	ON_UPDATE_COMMAND_UI(ID_REN, OnUpdateRen)
	ON_COMMAND(ID_NVREN, OnNvren)
	ON_UPDATE_COMMAND_UI(ID_NVREN, OnUpdateNvren)
	ON_UPDATE_COMMAND_UI(ID_TING, OnUpdateTing)
	ON_UPDATE_COMMAND_UI(ID_KAISHI, OnUpdateKaishi)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyTextView construction/destruction

CMyTextView::CMyTextView()
{
	// TODO: add construction code here
    fag=false;  //左键是否按下的标志
    fag3=true; //男人按键可以按的标志
	fag2=false; //是否进行拖动的标志
	fag4=true; //是否是女人的标志
	fag5=true; //女人按键是否可以按的标志
    p=q=0;
}

CMyTextView::~CMyTextView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyTextView drawing

void CMyTextView::OnDraw(CDC* pDC)
{
	CMyTextDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
    SetTimer(3,150,NULL);

}

/////////////////////////////////////////////////////////////////////////////
// CMyTextView printing

BOOL CMyTextView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyTextView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyTextView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyTextView diagnostics

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

void CMyTextView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyTextDoc* CMyTextView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyTextDoc)));
	return (CMyTextDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyTextView message handlers

int CMyTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	
	for (int i=0;i<FRAME_NUM;++i)       //装载男图片
	{
		m_Bitmap[i].LoadBitmap(IDB_BITMAP1+i);
	}
	for (int j=8;j<16;++j)              //装载女图片
	{
		m_Bitmap[j].LoadBitmap(IDB_BITMAP1+j);
	}

	BITMAP bm;
	m_Bitmap[0].GetBitmap(&bm);   
	m_nFrameWidth=bm.bmWidth;    //图片的宽度
	m_nFrameHeight=bm.bmHeight;   //图片的高度
	 
	m_nDetaX=m_nFrameWidth/4;   //初始化移动的增量
	m_nDetaY=m_nFrameHeight/4;  //初始化移动的增量
	
	m_ptCurPos=CPoint(0,0);  //初始化开始位置
	m_nCurFrameNo=0;  //男图片的第一张是从0开始
	m_nCurFrameNo1=8;  //女图片的第一张是从8开始

	
	return 0;
}

void CMyTextView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
    m_ptCurPos=CPoint(0,0);
	m_nCurFrameNo=0;
	m_nCurFrameNo1=8;


}

void CMyTextView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
if(nIDEvent==0x100)  //男没有被拖动的时候定时器
{
	ClearLastFrame(m_ptCurPos);  //清除前一图图片
 
	CalcNewPos(m_ptCurPos);   //算出新的位置

	DisplayFrame(m_ptCurPos,m_nCurFrameNo);  //显示图片

	CalcNewFrameNo(m_nCurFrameNo);  //算出下一幅图片的数

	
}
if(nIDEvent==0x10)  //男被拖动的时候定时器
{
	
	ClearLastFrame(m_ptCurPos1);  //清除前一图图片

	CalcNewPos(m_ptCurPos1);   //算出新的位置

	DisplayFrame(m_ptCurPos1,m_nCurFrameNo);  //显示图片

	CalcNewFrameNo(m_nCurFrameNo);//算出下一幅图片的数

}

if(nIDEvent==1)   //女没有被拖动的时候定时器
{
	ClearLastFrame(m_ptCurPos); //清除前一图图片

	CalcNewPos(m_ptCurPos);  //算出新的位置
  
	DisplayFrame(m_ptCurPos,m_nCurFrameNo1);  //显示图片

	CalcNewFrameNo1(m_nCurFrameNo1);  //算出下一幅图片的数

}

if(nIDEvent==2)  //女被拖动的时候定时器
{
	
	ClearLastFrame(m_ptCurPos1);  //清除前一图图片

	CalcNewPos(m_ptCurPos1);  //算出新的位置

	DisplayFrame(m_ptCurPos1,m_nCurFrameNo1);  //显示图片

	CalcNewFrameNo1(m_nCurFrameNo1); //算出下一幅图片的数

}
if(nIDEvent==3)
{
	LOGFONT lf;    
	CFont *poldFont;
	CFont oldFont;
	CDC *pDC=GetDC();
	poldFont=pDC->SelectObject(&oldFont);
    CFont font;
    lf.lfHeight=20;
   lf.lfEscapement=0;
	lf.lfWidth=0;
	lf.lfOrientation=0;
	lf.lfWeight=FW_NORMAL;
	lf.lfItalic=FALSE;
	lf.lfStrikeOut=FALSE;
	lf.lfUnderline=FALSE;
	lf.lfCharSet=GB2312_CHARSET;
	lf.lfOutPrecision=OUT_STROKE_PRECIS;
	lf.lfClipPrecision=CLIP_STROKE_PRECIS;
	lf.lfQuality=DRAFT_QUALITY;
	lf.lfPitchAndFamily=VARIABLE_PITCH|FF_MODERN;
	strcpy(lf.lfFaceName,"黑体");
	font.CreateFontIndirect(&lf);
	pDC->SetTextColor(RGB(rand()%256,rand()%256,rand()%256));
	pDC->SelectObject(&font);
	pDC->TextOut(200,0,"你好,欢迎使用动画文档");
}

CView::OnTimer(nIDEvent);
}


void CMyTextView::ClearLastFrame(CPoint ptCurPos)  //清除前一张图片的函数
{
	CRect rc(ptCurPos.x,ptCurPos.y,ptCurPos.x+m_nFrameWidth,ptCurPos.y+m_nFrameHeight);
	InvalidateRect(&rc);
	UpdateWindow();
}

void CMyTextView::CalcNewPos(CPoint &ptCurPos)  //计算新位置的函数
{
	CRect rc;
	GetClientRect(&rc);
	if(ptCurPos.x+m_nFrameWidth+m_nDetaX>=rc.right||ptCurPos.x+m_nDetaX<=rc.left) //当超出水平文档的宽度时,使图片以反方向移动
	{
		m_nDetaX=-m_nDetaX;
	}
	if(ptCurPos.y+m_nFrameHeight+m_nDetaY>=rc.bottom||ptCurPos.y+m_nDetaY<=rc.top) //当超出垂直文档高度时,使图片以方向移动
	{
	    m_nDetaY=-m_nDetaY;
	}

	ptCurPos.x+=m_nDetaX;   //得到新的位置
	ptCurPos.y+=m_nDetaY;
}


void CMyTextView::CalcNewFrameNo(int &nCurFrameNo)  //计算在新位置的男图片的数
{
	nCurFrameNo++;
	if(nCurFrameNo>=8)nCurFrameNo=0;

}


void CMyTextView::CalcNewFrameNo1(int &nCurFrameNo) //计算在新位置的女图片的数
{
	nCurFrameNo++;
	if(nCurFrameNo>=16)nCurFrameNo=8;

}


BOOL CMyTextView::DisplayFrame(CPoint ptPos,int nFrameNo)  //显示图片的函数
{
	CClientDC dc(this);
	CDC MemDC;
	if(!MemDC.CreateCompatibleDC(&dc))return FALSE;
	CBitmap *pOldBitmap=(CBitmap *)MemDC.SelectObject(&m_Bitmap[nFrameNo]);
	dc.BitBlt(ptPos.x,ptPos.y,m_nFrameWidth,m_nFrameHeight,&MemDC,0,0,SRCCOPY);
	MemDC.SelectObject(pOldBitmap);
	return TRUE;
}


void CMyTextView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	KillTimer(0x100);
	KillTimer(0x10);
	KillTimer(1);
	KillTimer(2);
	KillTimer(3);


}

void CMyTextView::OnTing() 
{
	// TODO: Add your command handler code here
	KillTimer(0x100);
	KillTimer(0x10);
	KillTimer(1);
	KillTimer(2);
	
	q=1;
	p=0;

	
	
}

void CMyTextView::OnKaishi() 
{
	// TODO: Add your command handler code here
if(fag1)
 {
   if(!fag4)   //屏幕是男的在运动
   {
	if(fag2)
	{
	SetTimer(0x10,250,NULL);
	}
	else 
	{  SetTimer(0x100,250,NULL);
	}
   }
  if(fag4)   //屏幕是女的在运动
  {  
	 if(fag2)
	{
	SetTimer(2,250,NULL);
	}
	else 
	{  SetTimer(1,250,NULL);
	}
  }

}
p=1;
q=0;

}

void CMyTextView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	KillTimer(0x100);
	KillTimer(0x10);
	KillTimer(1);
	KillTimer(2);
    fag=true;
	
	CView::OnLButtonDown(nFlags, point);
}

void CMyTextView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	
if(!fag4&&fag) //如果是男的图片且坐键曾被按下
{
    KillTimer(0x100);
	KillTimer(0x10);
	KillTimer(1);
	KillTimer(2);
	Invalidate();
	UpdateWindow();
	DisplayFrame(point,m_nCurFrameNo);
	
	fag2=true;
}
if(fag4&&fag)
{
    KillTimer(0x100);
	KillTimer(0x10);
	KillTimer(1);
	KillTimer(2);
	Invalidate();
	UpdateWindow();
	DisplayFrame(point,m_nCurFrameNo1);
	fag2=true;
}



   
CView::OnMouseMove(nFlags, point);
}

void CMyTextView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	fag=false;    //左键放开
    m_ptCurPos1.x=point.x; //设置新的位置
	m_ptCurPos1.y=point.y;
	if(fag4)   //如果显示是女的图片
	{
	    KillTimer(1);
		SetTimer(2,250,NULL); //设置新的定时器,重新开始计时
	}
	if(!fag4)   //如果显示是男的图片
	{
		KillTimer(0x100);
		SetTimer(0x10,250,NULL); //设置新的定时器,重新开始计时
	    
	}
CView::OnLButtonUp(nFlags, point);
}

void CMyTextView::OnRen() 
{
	// TODO: Add your command handler code here
	SetTimer(0x100,250,NULL);  //为男设置计时器
    m_ptCurPos=CPoint(0,0);   
	m_nCurFrameNo=0;
	
    KillTimer(1);
	KillTimer(0x10);
	KillTimer(2);

	Invalidate();
	fag4=false;  //屏幕是女人的标志
	fag3=false;   //男按键是否可用的标志
	fag5=true;   //女按键是否可用的标志
	
	p=q=0;

}

void CMyTextView::OnUpdateRen(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(fag3);  //设置男按键
    
}

void CMyTextView::OnNvren() 
{
	// TODO: Add your command handler code here
	SetTimer(1,250,NULL);  //为女设置计时器
	m_ptCurPos=CPoint(0,0);
	m_nCurFrameNo1=8;
	
    KillTimer(0x100);
	KillTimer(0x10);
	KillTimer(2);

	Invalidate();
	fag4=true;  //屏幕是女人的标志
	fag3=true; //男按键是否可用的标志
	fag5=false; //女按键是否可用的标志
	p=q=0;
    
}

void CMyTextView::OnUpdateNvren(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
    pCmdUI->Enable(fag5); //设置女按键
}




void CMyTextView::OnUpdateTing(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(q);
}

void CMyTextView::OnUpdateKaishi(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(p);
}