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); }