00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vmsImage_CtxFree.h"
00009
00010 #ifdef _DEBUG
00011 #undef THIS_FILE
00012 static char THIS_FILE[]=__FILE__;
00013 #define new DEBUG_NEW
00014 #endif
00015
00016 vmsImage_CtxFree::vmsImage_CtxFree()
00017 {
00018
00019 }
00020
00021 vmsImage_CtxFree::~vmsImage_CtxFree()
00022 {
00023 Free ();
00024 }
00025
00026 HRESULT vmsImage_CtxFree::Load(LPCSTR pszFile)
00027 {
00028 Free ();
00029
00030 HRESULT hr = m_Image.Load (pszFile);
00031 if (FAILED (hr))
00032 return hr;
00033
00034 CreateImagesBitmaps ();
00035
00036 m_Image.Free ();
00037 return S_OK;
00038 }
00039
00040 void vmsImage_CtxFree::CreateImagesBitmaps()
00041 {
00042 COLORREF clrBk = GetSysColor (COLOR_3DFACE);
00043
00044 m_vBitmaps.clear ();
00045
00046 int cFrames = m_Image.get_FrameCount ();
00047 m_cFrames = cFrames;
00048 m_iCurrentFrame = 0;
00049 if (cFrames == 0)
00050 cFrames = 1;
00051 else
00052 m_Image.set_CurrentFrame (0);
00053
00054 for (int i = 0; i < cFrames; i++)
00055 {
00056 if (i)
00057 m_Image.set_CurrentFrame (i);
00058
00059 HDC hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
00060 HDC hmem = CreateCompatibleDC (hdc);
00061 SIZE size = m_Image.get_Size ();
00062 HBITMAP hbm = CreateCompatibleBitmap (hdc, size.cx, size.cy);
00063 HBITMAP holdbm = (HBITMAP)SelectObject (hmem, hbm);
00064 RECT rc = {0, 0, size.cx, size.cy};
00065
00066 if (i == 0 )
00067 {
00068
00069 HBRUSH br = CreateSolidBrush (clrBk);
00070 FillRect (hmem, &rc, br);
00071 DeleteObject (br);
00072 }
00073 else
00074 {
00075
00076 POINT pt = {0,0};
00077 DrawBitmap (hmem, i-1, pt);
00078 }
00079
00080 m_Image.Draw (hmem, rc);
00081
00082 SelectObject (hmem, holdbm);
00083 m_vBitmaps.push_back (hbm);
00084 m_vSizes.push_back (size);
00085 }
00086
00087 for (i = 0; i < m_Image.get_FrameCount (); i++)
00088 m_vFrameDelays.push_back (m_Image.get_FrameDelay (i));
00089 }
00090
00091 void vmsImage_CtxFree::set_CurrentFrame(int iIndex)
00092 {
00093 m_iCurrentFrame = iIndex;
00094 }
00095
00096 SIZE vmsImage_CtxFree::get_Size()
00097 {
00098 return m_vSizes [m_iCurrentFrame];
00099 }
00100
00101 int vmsImage_CtxFree::get_FrameCount()
00102 {
00103 return m_cFrames;
00104 }
00105
00106 void vmsImage_CtxFree::Draw(HDC dc, RECT &rc)
00107 {
00108 if (m_vBitmaps.size () == 0)
00109 return;
00110
00111 POINT pt = {rc.left, rc.top};
00112 DrawBitmap (dc, m_iCurrentFrame, pt);
00113 }
00114
00115 int vmsImage_CtxFree::get_FrameDelay(int iIndex)
00116 {
00117 return m_vFrameDelays [iIndex];
00118 }
00119
00120 BOOL vmsImage_CtxFree::is_Loaded()
00121 {
00122 return m_vBitmaps.size () != 0;
00123 }
00124
00125 void vmsImage_CtxFree::Free()
00126 {
00127 for (size_t i = 0; i < m_vBitmaps.size (); i++)
00128 DeleteObject (m_vBitmaps [i]);
00129 m_vBitmaps.clear ();
00130 m_vFrameDelays.clear ();
00131 m_vSizes.clear ();
00132 m_Image.Free ();
00133 }
00134
00135 void vmsImage_CtxFree::DrawBitmap(HDC dc, int iBitmap, POINT pt)
00136 {
00137 HBITMAP hbm = m_vBitmaps [iBitmap];
00138 SIZE size = m_vSizes [iBitmap];
00139 HDC hmem = CreateCompatibleDC (dc);
00140 HBITMAP hbmold = (HBITMAP)SelectObject (hmem, hbm);
00141
00142 BitBlt (dc, pt.x, pt.y, size.cx, size.cy,
00143 hmem, 0, 0, SRCCOPY);
00144
00145 SelectObject (hmem, hbmold);
00146 DeleteDC (hmem);
00147 }