AnimWnd.cpp
上传用户:pengminm
上传日期:2007-01-01
资源大小:30k
文件大小:3k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // cAnimWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "WaitDialog.h"
  5. #include "AnimWnd.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // cAnimWnd
  13. cAnimWnd::cAnimWnd()
  14. {
  15.    m_ImageIndex = -1;
  16.    m_MemDC = NULL;
  17. }
  18. cAnimWnd::~cAnimWnd()
  19. {
  20.    if (m_MemDC)
  21.       delete m_MemDC;
  22.    m_Bitmap.Detach();
  23.    m_Bitmap.DeleteObject();
  24. }
  25. BEGIN_MESSAGE_MAP(cAnimWnd, CWnd)
  26. //{{AFX_MSG_MAP(cAnimWnd)
  27. ON_WM_TIMER()
  28. ON_WM_PAINT()
  29. //}}AFX_MSG_MAP
  30. END_MESSAGE_MAP()
  31. /////////////////////////////////////////////////////////////////////////////
  32. // cAnimWnd message handlers
  33. void cAnimWnd::SetImageList(UINT BitmapID, short Sizex, short Sizey, COLORREF TransparentColor)
  34. {
  35.    m_TransparentColor = TransparentColor;
  36.    m_Bitmap.LoadBitmap(BitmapID);
  37.    m_Width = Sizex;
  38.    m_Height = Sizey;
  39.    CPoint ptSize;
  40.    BITMAP bm_info;
  41.    m_Bitmap.GetBitmap(&bm_info);
  42.    ptSize.x = bm_info.bmWidth;
  43. ptSize.y = bm_info.bmHeight;
  44.    m_MemDC = new cMemDC(this->GetDC(), CRect(0,0,ptSize.x, ptSize.y));
  45.    m_MemDC->SelectObject(&m_Bitmap);
  46. }
  47. void cAnimWnd::OnPaint() 
  48. {
  49. CPaintDC dc(this); // device context for painting
  50. // TODO: Add your message handler code here
  51.    if (m_MemDC)
  52.       {
  53.       // paint current image
  54.       dc.BitBlt(0,0,m_Width, m_Height, m_MemDC, ((m_ImageIndex) * m_Width),0,SRCCOPY);
  55.       }
  56.    else
  57.       {
  58.    CWnd::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0);
  59.       return;
  60.       }
  61. // Do not call CWnd::OnPaint() for painting messages
  62. }
  63. void cAnimWnd::OnTimer(UINT nIDEvent) 
  64. {
  65. // TODO: Add your message handler code here and/or call default
  66. switch (nIDEvent)
  67.       {
  68.       case TIMER_ID:
  69.          {
  70.          if (m_MemDC)
  71.             {
  72.             if (m_ImageIndex++ >= GetImageCount() - 1)
  73.                m_ImageIndex = 0;
  74.             Invalidate(TRUE);
  75.             }
  76.          }
  77.       }
  78. CWnd::OnTimer(nIDEvent);
  79. }
  80. UINT cAnimWnd::StartAnim(short Delay)
  81. {
  82.    UINT ret = SetTimer(TIMER_ID, Delay, NULL);
  83.    return ret;
  84. }
  85. BOOL cAnimWnd::StopAnim()
  86. {
  87.    if (!KillTimer(TIMER_ID))
  88.       return FALSE;
  89.    return TRUE;
  90. }
  91. BOOL cAnimWnd::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  92. {
  93. // TODO: Add your specialized code here and/or call the base class
  94.    CString wndclass = ::AfxRegisterWndClass(CS_DBLCLKS,
  95.      ::LoadCursor(NULL, IDC_ARROW),
  96.      ::GetSysColorBrush(COLOR_BTNFACE), 0);
  97. BOOL ret = CWnd::CreateEx(0L, wndclass, NULL, dwStyle, rect, pParentWnd, nID, pContext);
  98.    return ret;
  99. }
  100. int cAnimWnd::GetImageCount()
  101. {
  102.    BITMAP bm_info;
  103.    m_Bitmap.GetBitmap(&bm_info);
  104.    int x = bm_info.bmWidth;
  105.    return (int)(x / m_Width);
  106. }