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

BREW编程

开发平台:

Visual C++

  1. #include "ISnowMenu.h"
  2. #include "AEEAppGen.h"
  3. #include "Winmine.bid"
  4. ///////////////////////////////////////////////////////////////////////////////
  5. ///////////////////////////////////////////////////////////////////////////////
  6. //
  7. #define MAX_POPO_NUM 3
  8. #define POPO_TATE       200
  9. #define MENUMOVE_STEP 48
  10. #define MINE_TANSPARENT_COLOR MAKE_RGB(255,255,255)
  11. #define BUTTONCOL_SEL MAKE_RGB(255,0,0)
  12. #define BUTTONCOL_UNSEL MAKE_RGB(0,255,0)
  13. static void ISNOWMENU_TimerHDL(ISnowMenu* pCtl);
  14. static boolean ISNOWMENU_GeneratePopo(ISnowMenu* pCtl);
  15. static boolean ISNOWMENU_Draw(ISnowMenu* pCtl);
  16. ///////////////////////////////////////////////////////////////////////////////
  17. ///////////////////////////////////////////////////////////////////////////////
  18. ISnowMenu* ISNOWMENU_CreateInstance()
  19. {
  20. AEEDeviceInfo di;
  21. AEEApplet* pApp=(AEEApplet*)GETAPPINSTANCE();
  22. ISnowMenu* pCtl=MALLOCREC(ISnowMenu);
  23. if(NULL==pCtl||NULL==pApp)  
  24. {
  25. ISNOWMENU_Release(pCtl);
  26. return NULL;
  27. }
  28. pCtl->m_pIDisplay=pApp->m_pIDisplay;
  29. pCtl->m_pIShell=pApp->m_pIShell;
  30. pCtl->m_Popo=NULL;
  31. pCtl->m_PopoNum=0;
  32. pCtl->m_ActiveItem=CMD_MENUSTART;
  33. ISHELL_GetDeviceInfo(pApp->m_pIShell,&di);
  34. pCtl->m_rt.x=pCtl->m_rt.y=0;
  35. pCtl->m_rt.dx=di.cxScreen;
  36. pCtl->m_rt.dy=di.cyScreen;
  37. pCtl->m_pOldScreen=ISHELL_LoadBitmap(pApp->m_pIShell,"menuimg/menu.bmp");
  38. pCtl->m_pCursor=ISHELL_LoadBitmap(pApp->m_pIShell,"menuimg/cur.bmp");
  39. if(pCtl->m_pCursor)
  40. {
  41. AEEBitmapInfo info;
  42. IBITMAP_SetTransparencyColor(pCtl->m_pCursor,IBITMAP_RGBToNative(pCtl->m_pCursor,MINE_TANSPARENT_COLOR));
  43. IBITMAP_GetInfo(pCtl->m_pCursor,&info,sizeof(AEEBitmapInfo));
  44. pCtl->m_CursorRect.dx=(int)info.cx;
  45. pCtl->m_CursorRect.dy=(int)info.cy;
  46. pCtl->m_CursorRect.x=pCtl->m_rt.x+pCtl->m_rt.dx-2*pCtl->m_CursorRect.dx;
  47. pCtl->m_CursorRect.y=pCtl->m_rt.y+pCtl->m_rt.dy/4;
  48. }
  49. pCtl->m_pMusic=IMINEMUSIC_CreateInstance(pApp->m_pIShell);
  50. return pCtl;
  51. }
  52. boolean ISNOWMENU_Release(ISnowMenu* pCtl)
  53. {
  54. if(!pCtl) return FALSE;
  55. ISNOWMENU_Stop(pCtl);
  56. if(pCtl->m_pOldScreen)
  57. {
  58. IBITMAP_Release(pCtl->m_pOldScreen);
  59. pCtl->m_pOldScreen=NULL;
  60. }
  61. if(pCtl->m_pMusic)
  62. {
  63. IMINEMUSIC_Release(pCtl->m_pMusic);
  64. pCtl->m_pMusic=NULL;
  65. }
  66. return TRUE;
  67. }
  68. boolean ISNOWMENU_Start(ISnowMenu* pCtl)
  69. {
  70. if(!ISNOWMENU_Stop(pCtl)) return FALSE;
  71. IMINEMUSIC_Start(pCtl->m_pMusic,MMT_FLASH);
  72. ISNOWMENU_TimerHDL(pCtl);
  73. return TRUE;
  74. }
  75. boolean ISNOWMENU_Stop(ISnowMenu* pCtl)
  76. {
  77. TPopo* popo;
  78. if(!pCtl) return FALSE;
  79. ISHELL_CancelTimer(pCtl->m_pIShell,(PFNNOTIFY)ISNOWMENU_TimerHDL, pCtl);
  80. //release all popo
  81. popo=pCtl->m_Popo;
  82. while(popo)
  83. {
  84. pCtl->m_Popo=popo->pNext;
  85. if(popo->bitmap)
  86. IBITMAP_Release(popo->bitmap);
  87. FREE(popo);
  88. popo=pCtl->m_Popo;
  89. }
  90. pCtl->m_PopoNum=0;
  91. IMINEMUSIC_Stop(pCtl->m_pMusic);
  92. return TRUE;
  93. }
  94. boolean ISNOWMENU_HandleKeyEvent(ISnowMenu* pCtl,uint16 wParam)
  95. {
  96. if(!pCtl) return FALSE;
  97. switch(wParam)
  98. {
  99. case AVK_SELECT:
  100. case AVK_RIGHT:
  101. ISNOWMENU_Stop(pCtl);
  102. ISHELL_PostEvent(pCtl->m_pIShell, AEECLSID_WINMINE, EVT_USER, pCtl->m_ActiveItem, (uint32) 0);
  103. break;
  104. case AVK_UP:
  105. pCtl->m_ActiveItem--;
  106. if(CMD_MENUMIN==pCtl->m_ActiveItem)
  107. pCtl->m_ActiveItem=CMD_MENUMAX-1;
  108. ISNOWMENU_Draw(pCtl);
  109. break;
  110. case AVK_DOWN:
  111. pCtl->m_ActiveItem++;
  112. if(CMD_MENUMAX==pCtl->m_ActiveItem)
  113. pCtl->m_ActiveItem=CMD_MENUMIN+1;
  114. ISNOWMENU_Draw(pCtl);
  115. break;
  116. default:
  117. return FALSE;
  118. }
  119. return TRUE;
  120. }
  121. ///////////////////////////////////////////////////////////////////////////////
  122. ///////////////////////////////////////////////////////////////////////////////
  123. static void ISNOWMENU_TimerHDL(ISnowMenu* pCtl)
  124. {
  125. TPopo* popo;
  126. ISHELL_CancelTimer(pCtl->m_pIShell,(PFNNOTIFY)ISNOWMENU_TimerHDL, pCtl);
  127. //refresh popo local
  128. ISNOWMENU_GeneratePopo(pCtl);
  129. popo=pCtl->m_Popo;
  130. while(popo)
  131. {
  132. popo->rt.y-=10;
  133. if(popo->rt.y<(0-popo->rt.dy))
  134. {
  135. TPopo* p;
  136. if(popo==pCtl->m_Popo)//first
  137. {
  138. pCtl->m_Popo=NULL;
  139. }
  140. else
  141. {
  142. p=pCtl->m_Popo;
  143. while(p->pNext!=popo) p=p->pNext;
  144. p->pNext=NULL;
  145. }
  146. while(popo)
  147. {
  148. p=popo;
  149. popo=p->pNext;
  150. if(p->bitmap)
  151. IBITMAP_Release(p->bitmap);
  152. FREE(p);
  153. pCtl->m_PopoNum--;
  154. }
  155. }
  156. else
  157. popo=popo->pNext;
  158. }
  159. //draw
  160. ISNOWMENU_Draw(pCtl);
  161. ISHELL_SetTimer(pCtl->m_pIShell,100,(PFNNOTIFY)ISNOWMENU_TimerHDL, pCtl);
  162. }
  163. static boolean ISNOWMENU_GeneratePopo(ISnowMenu* pCtl)
  164. {
  165. byte   data;
  166. char* filename;
  167. TPopo* popo;
  168. AEEBitmapInfo info;
  169.  
  170. if(pCtl->m_PopoNum>=MAX_POPO_NUM) return FALSE;
  171. GETRAND(&data,1);
  172. if(data<POPO_TATE) return FALSE;
  173. data-=POPO_TATE;
  174. popo=MALLOCREC(TPopo);
  175. if(!popo) return FALSE;
  176. switch(data&3)
  177. {
  178. case 0:
  179. filename="menuimg/pop1.bmp";
  180. break;
  181. case 1:
  182. filename="menuimg/pop2.bmp";
  183. break;
  184. default:
  185. filename="menuimg/pop3.bmp";
  186. }
  187. popo->bitmap= ISHELL_LoadBitmap(pCtl->m_pIShell,filename);
  188. if(!popo->bitmap)
  189. {
  190. FREEIF(popo);
  191. return FALSE;
  192. }
  193. IBITMAP_SetTransparencyColor(popo->bitmap,IBITMAP_RGBToNative(popo->bitmap,MINE_TANSPARENT_COLOR));
  194. IBITMAP_GetInfo(popo->bitmap,&info,sizeof(AEEBitmapInfo));
  195. popo->rt.dx=(int)info.cx;
  196. popo->rt.dy=(int)info.cy;
  197. popo->rt.x=pCtl->m_rt.dx*data/(256-POPO_TATE)-(int)info.cx/2;
  198. popo->rt.y=pCtl->m_rt.dy;
  199. pCtl->m_PopoNum++;
  200. popo->pNext=pCtl->m_Popo;
  201. pCtl->m_Popo=popo;
  202. return TRUE;
  203. }
  204. static boolean ISNOWMENU_Draw(ISnowMenu* pCtl)
  205. {
  206. TPopo* popo=pCtl->m_Popo;
  207. AEERect rect=pCtl->m_rt;
  208. //background
  209. if(pCtl->m_pOldScreen)
  210. {
  211. IDISPLAY_BitBlt(pCtl->m_pIDisplay, 
  212. 0,0,
  213. pCtl->m_rt.dx,
  214. pCtl->m_rt.dy,
  215. pCtl->m_pOldScreen, 
  216. 0,0,
  217. AEE_RO_COPY);
  218. }
  219. else
  220. IDISPLAY_ClearScreen(pCtl->m_pIDisplay);
  221. IDISPLAY_FrameRect(pCtl->m_pIDisplay,&rect);
  222. //menu
  223. if(pCtl->m_pCursor)
  224. {
  225. int y=(CMD_MENUSTART==pCtl->m_ActiveItem)?0:((CMD_MENUSCORE==pCtl->m_ActiveItem)?1:2);
  226. IDISPLAY_BitBlt(pCtl->m_pIDisplay, 
  227. pCtl->m_CursorRect.x,(pCtl->m_CursorRect.y+y*MENUMOVE_STEP),
  228. pCtl->m_CursorRect.dx,pCtl->m_CursorRect.dy,
  229. pCtl->m_pCursor, 
  230. 0,0,
  231. AEE_RO_TRANSPARENT );
  232. }
  233. //popo
  234. while(popo)
  235. {
  236. if(popo->bitmap)
  237. IDISPLAY_BitBlt(pCtl->m_pIDisplay, 
  238. popo->rt.x,popo->rt.y,
  239. popo->rt.dx,popo->rt.dy,
  240. popo->bitmap, 
  241. 0,0,
  242. AEE_RO_TRANSPARENT );
  243. popo=popo->pNext;
  244. }
  245. IDISPLAY_Update(pCtl->m_pIDisplay);
  246. return TRUE;
  247. }