IPlay.c
上传用户:yulinhuamu
上传日期:2009-12-26
资源大小:7287k
文件大小:4k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #include "IPlay.h"
  2. #include "Winmine.bid"
  3. #include "AEEAppGen.h"
  4. ////////////////////////////////////////////////////////////////////
  5. ////////////////////////////////////////////////////////////////////
  6. #define MOVE_STEP  10
  7. static void IMINEPLAY_TimerHdl(IMinePlay* pCtl);
  8. static void IMINEPLAY_InitImage(IMinePlay* pCtl);
  9. static void IMINEPLAY_FreeImage(IMinePlay* pCtl);
  10. static void IMINEPLAY_Draw(IMinePlay* pCtl,AEERect* rt);
  11. ////////////////////////////////////////////////////////////////////
  12. ////////////////////////////////////////////////////////////////////
  13. IMinePlay* IMINEPLAY_CreateInstance(AEERect *rt)
  14. {
  15. AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
  16. IMinePlay* p=NULL;
  17. IFileMgr* pMgr=NULL;
  18. TVedioElement* pName;
  19. FileInfo Info;
  20. if(NULL==rt||NULL==pApp) return NULL;
  21. p=MALLOCREC(IMinePlay);
  22. if(p)
  23. {
  24. p->m_rt=*rt;
  25. p->m_pImage=NULL;
  26. p->m_pIDisplay=pApp->m_pIDisplay;
  27. p->m_pIShell=pApp->m_pIShell;
  28. p->m_pNameList=NULL;
  29. p->m_ListSize=0;
  30. if (SUCCESS==ISHELL_CreateInstance(p->m_pIShell, AEECLSID_FILEMGR, (void **)&pMgr))
  31. {
  32. if(SUCCESS==IFILEMGR_EnumInit(pMgr,"image",FALSE))
  33. {
  34. while(IFILEMGR_EnumNext(pMgr, &Info))
  35. {
  36. pName=MALLOCREC(TVedioElement);
  37. if(pName)
  38. {
  39. pName->m_pData=STRDUP(Info.szName);
  40. pName->m_pNext=p->m_pNameList;
  41. p->m_pNameList=pName;
  42. p->m_ListSize++;
  43. }
  44. }
  45. }
  46. IFILEMGR_Release(pMgr);
  47. }
  48. }
  49. return p;
  50. }
  51. boolean IMINEPLAY_Release(IMinePlay* pCtl)
  52. {
  53. TVedioElement* p;
  54. if(pCtl)
  55. {
  56. IMINEPLAY_FreeImage(pCtl);
  57. p=pCtl->m_pNameList;
  58. while(p)
  59. {
  60. pCtl->m_pNameList=p->m_pNext;
  61. FREEIF(p->m_pData);
  62. FREE(p);
  63. p=pCtl->m_pNameList;
  64. }
  65. FREEIF(pCtl);
  66. }
  67. return TRUE;
  68. }
  69. boolean IMINEPLAY_Start(IMinePlay* pCtl)
  70. {
  71. if(!pCtl) return FALSE;
  72. IMINEPLAY_FreeImage(pCtl);
  73. IMINEPLAY_InitImage(pCtl);
  74. pCtl->m_ShowPoint=MOVE_STEP;
  75. IMINEPLAY_TimerHdl(pCtl);
  76. return TRUE;
  77. }
  78. boolean IMINEPLAY_Stop(IMinePlay* pCtl)
  79. {
  80. if(!pCtl) return FALSE;
  81. IMINEPLAY_FreeImage(pCtl);
  82. return TRUE;
  83. }
  84. ////////////////////////////////////////////////////////////////////
  85. ////////////////////////////////////////////////////////////////////
  86. static void IMINEPLAY_TimerHdl(IMinePlay* pCtl)
  87. {
  88. AEERect rt;
  89. int32 sec;
  90. pCtl->m_ShowPoint--;
  91. ISHELL_CancelTimer(pCtl->m_pIShell,(PFNNOTIFY) IMINEPLAY_TimerHdl, pCtl);
  92. if(pCtl->m_ShowPoint<0)
  93. {
  94. if(pCtl->m_pImage)
  95. {
  96. IIMAGE_Release(pCtl->m_pImage);
  97. pCtl->m_pImage=NULL;
  98. }
  99. ISHELL_PostEvent(pCtl->m_pIShell, AEECLSID_WINMINE, EVT_USER, CMD_RESTART, (uint32) 0);
  100. return;
  101. }
  102. rt.dx=pCtl->m_rt.dx*(MOVE_STEP-pCtl->m_ShowPoint)/MOVE_STEP;
  103. rt.dy=pCtl->m_rt.dy*(MOVE_STEP-pCtl->m_ShowPoint)/MOVE_STEP;
  104. rt.x=pCtl->m_rt.x+(pCtl->m_rt.dx-rt.dx)/2;
  105. rt.y=pCtl->m_rt.y+(pCtl->m_rt.dy-rt.dy)/2;
  106. IMINEPLAY_Draw(pCtl,&rt);
  107. sec=((0==pCtl->m_ShowPoint)?800:200);
  108. ISHELL_SetTimer(pCtl->m_pIShell,sec,(PFNNOTIFY) IMINEPLAY_TimerHdl, pCtl);
  109. }
  110. static void IMINEPLAY_InitImage(IMinePlay* pCtl)
  111. {
  112. char* pName=NULL;
  113. byte   data;
  114. AEEImageInfo  pi;
  115. TVedioElement* pp=pCtl->m_pNameList;
  116. if(1==pCtl->m_ListSize)
  117. pName=pp->m_pData;
  118. else if(pCtl->m_ListSize>1)
  119. {
  120. GETRAND(&data,1);
  121. data=pCtl->m_ListSize*data/256;
  122. while((data--)>0)
  123. pp=pp->m_pNext;
  124. pName=pp->m_pData;
  125. }
  126. if(pName)
  127. pCtl->m_pImage=ISHELL_LoadImage(pCtl->m_pIShell,pName);
  128. if(pCtl->m_pImage)
  129. {
  130. IIMAGE_GetInfo(pCtl->m_pImage,&pi);
  131. pCtl->m_Imagedx=pi.cx;
  132. pCtl->m_Imagedy=pi.cy;
  133. }
  134. }
  135. static void IMINEPLAY_FreeImage(IMinePlay* pCtl)
  136. {
  137. ISHELL_CancelTimer(pCtl->m_pIShell,(PFNNOTIFY)IMINEPLAY_TimerHdl, pCtl);
  138. if(pCtl->m_pImage)
  139. {
  140. IIMAGE_Release(pCtl->m_pImage);
  141. pCtl->m_pImage=NULL;
  142. }
  143. }
  144. static void IMINEPLAY_Draw(IMinePlay* pCtl,AEERect* rt)
  145. {
  146. AEERect rect;
  147. int offsetx=0;
  148. int offsety=0;
  149. int x=rt->x;
  150. int y=rt->y;
  151. int dx=rt->dx;
  152. int dy=rt->dy;
  153. if(!pCtl->m_pImage) return;
  154. if(pCtl->m_Imagedx<rt->dx)
  155. {
  156. dx=pCtl->m_Imagedx;
  157. x=rt->x+(rt->dx-pCtl->m_Imagedx)/2;
  158. }
  159. else
  160. offsetx=(pCtl->m_Imagedx-rt->dx)/2;
  161. if(pCtl->m_Imagedy<rt->dy)
  162. {
  163. dy=pCtl->m_Imagedy;
  164. y=rt->y+(rt->dy-pCtl->m_Imagedy)/2;
  165. }
  166. else
  167. offsety=(pCtl->m_Imagedy-rt->dy)/2;
  168. rect.x=x;
  169. rect.y=y;
  170. rect.dx=dx;
  171. rect.dy=dy;
  172. IIMAGE_SetParm(pCtl->m_pImage, IPARM_OFFSET,offsetx,offsety);
  173. IIMAGE_SetParm(pCtl->m_pImage, IPARM_SIZE,dx,dy);
  174. IIMAGE_Draw(pCtl->m_pImage,x,y);
  175. IDISPLAY_FrameRect(pCtl->m_pIDisplay,&rect);
  176. IDISPLAY_Update(pCtl->m_pIDisplay);
  177. }