#include "StdAfx.h" #include "DrawSiceWnd.h" ////////////////////////////////////////////////////////////////////////// #define IDI_SICE_POS 203 //移动定时器 ////////////////////////////////////////////////////////////////////////// BEGIN_MESSAGE_MAP(CDrawSiceWnd, CWnd) ON_WM_PAINT() ON_WM_CREATE() ON_WM_TIMER() END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// //构造函数 CDrawSiceWnd::CDrawSiceWnd() { //加载资源 m_bSicePos=0; m_nXPos=0; m_nYPos=0; HINSTANCE hInstance=AfxGetInstanceHandle(); m_ImageBack.LoadFromResource(hInstance, IDB_SICE_BACK); for ( int i = 0; i < 12; ++i ) { m_ImageDrawSice[i].LoadFromResource(hInstance, IDB_DRAW_SICE1 + i); } m_ImageDrawSiceUserSecond = NULL; m_ImageDrawSiceSecond = NULL; m_ImageDrawSiceUserFirst = NULL; m_ImageDrawSiceUserSecond = NULL; return; } //析构函数 CDrawSiceWnd::~CDrawSiceWnd() { } //重画函数 void CDrawSiceWnd::OnPaint() { CPaintDC dc(this); //获取位置 CRect rcClient; GetClientRect(&rcClient); //创建缓冲 CDC BufferDC; CBitmap BufferImage; BufferDC.CreateCompatibleDC(&dc); BufferImage.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()); BufferDC.SelectObject(&BufferImage); //绘画背景 m_ImageBack.BitBlt(BufferDC,0,0); if(m_bSicePos<9 ) { if ( m_ImageDrawSiceFirst ) m_ImageDrawSiceFirst->TransDrawImage(&BufferDC,30,0,m_ImageDrawSiceFirst->GetWidth()/9,m_ImageDrawSiceFirst->GetHeight(), m_bSicePos*m_ImageDrawSiceFirst->GetWidth()/9,0,RGB(0,0,255)); if ( m_ImageDrawSiceSecond ) m_ImageDrawSiceSecond->TransDrawImage(&BufferDC,30,0,m_ImageDrawSiceSecond->GetWidth()/9,m_ImageDrawSiceSecond->GetHeight(),m_bSicePos*m_ImageDrawSiceSecond->GetWidth()/9,0,RGB(0,0,255)); } else { if ( m_ImageDrawSiceUserFirst ) m_ImageDrawSiceUserFirst->TransDrawImage(&BufferDC,30,0,m_ImageDrawSiceUserFirst->GetWidth()/9,m_ImageDrawSiceUserFirst->GetHeight(),m_bSicePos%9*m_ImageDrawSiceUserFirst->GetWidth()/9,0,RGB(0,0,255)); if ( m_ImageDrawSiceUserSecond ) m_ImageDrawSiceUserSecond->TransDrawImage(&BufferDC,30,0,m_ImageDrawSiceUserSecond->GetWidth()/9,m_ImageDrawSiceUserSecond->GetHeight(),m_bSicePos%9*m_ImageDrawSiceUserSecond->GetWidth()/9,0,RGB(0,0,255)); } //绘画界面 dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&BufferDC,0,0,SRCCOPY); //清理资源 BufferDC.DeleteDC(); BufferImage.DeleteObject(); return; } //建立消息 int CDrawSiceWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (__super::OnCreate(lpCreateStruct)==-1) return -1; SetWindowPos(NULL,0,0,m_ImageBack.GetWidth(),m_ImageBack.GetHeight(),SWP_NOZORDER|SWP_NOREPOSITION); return 0; } //定时器消息 void CDrawSiceWnd::OnTimer(UINT nIDEvent) { if(IDI_SICE_POS==nIDEvent) { if(m_bSicePos>=17) { KillTimer(IDI_SICE_POS); Sleep(1000); CGameFrameView::GetInstance()->PostEngineMessage(IDM_SICE_FINISH,NULL,NULL); } else { if(m_bSicePos==8) { Sleep(1000); CGameFrameView::GetInstance()->PostEngineMessage(IDM_SICE_TWO,NULL,NULL); } m_bSicePos++; } Invalidate(); } __super::OnTimer(nIDEvent); } //设置色子信息 void CDrawSiceWnd::SetSiceInfo(CDC *dc,BYTE bMoveTime,WORD wSice1,WORD wSice2) { HINSTANCE hInstance=AfxGetInstanceHandle(); ParentDC=dc; BYTE SiceFirst,SiceSecond; if( wSice1 > 0 ) { SiceFirst = HIBYTE(wSice1); SiceSecond = LOBYTE(wSice1); ASSERT( SiceFirst > 0 && SiceFirst < 7 && SiceSecond > 0 && SiceSecond < 7 ); m_ImageDrawSiceFirst = &m_ImageDrawSice[SiceFirst-1]; m_ImageDrawSiceSecond = &m_ImageDrawSice[6 + SiceSecond-1]; //m_ImageDrawSiceFirst.LoadFromResource(hInstance, IDB_DRAW_SICE1+SiceFirst-1); //m_ImageDrawSiceSecond.LoadFromResource(hInstance, IDB_DRAW_SICE7+SiceSecond-1); } if( wSice2 > 0 ) { SiceFirst = HIBYTE(wSice2); SiceSecond = LOBYTE(wSice2); ASSERT( SiceFirst > 0 && SiceFirst < 7 && SiceSecond > 0 && SiceSecond < 7 ); m_ImageDrawSiceUserFirst = &m_ImageDrawSice[SiceFirst-1]; m_ImageDrawSiceUserSecond = &m_ImageDrawSice[6 + SiceSecond-1]; //m_ImageDrawSiceUserFirst.LoadFromResource(hInstance, IDB_DRAW_SICE1+SiceFirst-1); //m_ImageDrawSiceUserSecond.LoadFromResource(hInstance, IDB_DRAW_SICE7+SiceSecond-1); } m_bSicePos = (wSice1>0)?0:9; SetTimer(IDI_SICE_POS,bMoveTime,NULL); } //基准位置 void CDrawSiceWnd::SetBenchmarkPos(int nXPos, int nYPos) { m_nXPos=nXPos; m_nYPos=nYPos; } //设置窗口钩子 void CDrawSiceWnd::SetWindowSink(CWnd *pSinkWnd) { m_pSinkWnd = pSinkWnd; } //////////////////////////////////////////////////////////////////////////