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

BREW编程

开发平台:

Visual C++

  1. /*===========================================================================
  2. FILE: Winmine.c
  3. ===========================================================================*/
  4. /*===============================================================================
  5. INCLUDES AND VARIABLE DEFINITIONS
  6. =============================================================================== */
  7. #include "AEEModGen.h"          // Module interface definitions
  8. #include "AEEAppGen.h"          // Applet interface definitions
  9. #include "AEEShell.h"           // Shell interface definitions
  10. #include "Winmine.bid"
  11. #include "mine.h"
  12. #include "IPlay.h"
  13. #include "ISnowMenu.h"
  14. /*-------------------------------------------------------------------
  15. Applet structure. All variables in here are reference via "pMe->"
  16. -------------------------------------------------------------------*/
  17. // create an applet structure that's passed around. All variables in
  18. // here will be able to be referenced as static.
  19. typedef enum
  20. {
  21. STATE_NOTHING,
  22. STATE_MENU,
  23. STATE_VEDIO,
  24. STATE_MINE,
  25. STATE_SCORE
  26. }TMineState;
  27. typedef struct _Winmine {
  28. AEEApplet      a ;        // First element of this structure must be AEEApplet
  29.     AEEDeviceInfo  DeviceInfo; // always have access to the hardware device information
  30.     
  31.     IDisplay      *pIDisplay;  // give a standard way to access the Display interface
  32.     IShell        *pIShell;    // give a standard way to access the Shell interface
  33.     // add your own variables here...
  34. IWinmine* m_pMine;
  35. IMinePlay* m_Play;
  36. ISnowMenu* m_pSnowMenu;
  37. TMineState m_State;
  38. } Winmine;
  39. /*-------------------------------------------------------------------
  40. Function Prototypes
  41. -------------------------------------------------------------------*/
  42. static  boolean Winmine_HandleEvent(Winmine* pMe, AEEEvent eCode, 
  43.                                              uint16 wParam, uint32 dwParam);
  44. boolean Winmine_InitAppData(Winmine* pMe);
  45. void    Winmine_FreeAppData(Winmine* pMe);
  46. static void Winmine_Number2WSTR(int n,AECHAR* p,int nSize);
  47. static void Winmine_DrawScore(Winmine* pMe);
  48. /*===============================================================================
  49. FUNCTION DEFINITIONS
  50. =============================================================================== */
  51. /*===========================================================================
  52. FUNCTION: AEEClsCreateInstance
  53. DESCRIPTION
  54. This function is invoked while the app is being loaded. All Modules must provide this 
  55. function. Ensure to retain the same name and parameters for this function.
  56. In here, the module must verify the ClassID and then invoke the AEEApplet_New() function
  57. that has been provided in AEEAppGen.c. 
  58.    After invoking AEEApplet_New(), this function can do app specific initialization. In this
  59.    example, a generic structure is provided so that app developers need not change app specific
  60.    initialization section every time except for a call to IDisplay_InitAppData(). 
  61.    This is done as follows: InitAppData() is called to initialize AppletData 
  62.    instance. It is app developers responsibility to fill-in app data initialization 
  63.    code of InitAppData(). App developer is also responsible to release memory 
  64.    allocated for data contained in AppletData -- this can be done in 
  65.    IDisplay_FreeAppData().
  66. PROTOTYPE:
  67.    int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
  68. PARAMETERS:
  69. clsID: [in]: Specifies the ClassID of the applet which is being loaded
  70. pIShell: [in]: Contains pointer to the IShell object. 
  71. pIModule: pin]: Contains pointer to the IModule object to the current module to which
  72. this app belongs
  73. ppObj: [out]: On return, *ppObj must point to a valid IApplet structure. Allocation
  74. of memory for this structure and initializing the base data members is done by AEEApplet_New().
  75. DEPENDENCIES
  76.   none
  77. RETURN VALUE
  78.   AEE_SUCCESS: If the app needs to be loaded and if AEEApplet_New() invocation was
  79.      successful
  80.   EFAILED: If the app does not need to be loaded or if errors occurred in 
  81.      AEEApplet_New(). If this function returns FALSE, the app will not be loaded.
  82. SIDE EFFECTS
  83.   none
  84. ===========================================================================*/
  85. int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj)
  86. {
  87. *ppObj = NULL;
  88. if( ClsId == AEECLSID_WINMINE )
  89. {
  90. // Create the applet and make room for the applet structure
  91. if( AEEApplet_New(sizeof(Winmine),
  92.                           ClsId,
  93.                           pIShell,
  94.                           po,
  95.                           (IApplet**)ppObj,
  96.                           (AEEHANDLER)Winmine_HandleEvent,
  97.                           (PFNFREEAPPDATA)Winmine_FreeAppData) ) // the FreeAppData function is called after sending EVT_APP_STOP to the HandleEvent function
  98.                           
  99. {
  100. //Initialize applet data, this is called before sending EVT_APP_START
  101.             // to the HandleEvent function
  102. if(Winmine_InitAppData((Winmine*)*ppObj))
  103. {
  104. //Data initialized successfully
  105. return(AEE_SUCCESS);
  106. }
  107. else
  108. {
  109. //Release the applet. This will free the memory allocated for the applet when
  110. // AEEApplet_New was called.
  111. IAPPLET_Release((IApplet*)*ppObj);
  112. return EFAILED;
  113. }
  114.         } // end AEEApplet_New
  115.     }
  116. return(EFAILED);
  117. }
  118. /*===========================================================================
  119. FUNCTION SampleAppWizard_HandleEvent
  120. DESCRIPTION
  121. This is the EventHandler for this app. All events to this app are handled in this
  122. function. All APPs must supply an Event Handler.
  123. PROTOTYPE:
  124. boolean SampleAppWizard_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
  125. PARAMETERS:
  126. pi: Pointer to the AEEApplet structure. This structure contains information specific
  127. to this applet. It was initialized during the AEEClsCreateInstance() function.
  128. ecode: Specifies the Event sent to this applet
  129.    wParam, dwParam: Event specific data.
  130. DEPENDENCIES
  131.   none
  132. RETURN VALUE
  133.   TRUE: If the app has processed the event
  134.   FALSE: If the app did not process the event
  135. SIDE EFFECTS
  136.   none
  137. ===========================================================================*/
  138. static boolean Winmine_HandleEvent(Winmine* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
  139. {  
  140. DBGPRINTF("--------------------->>>>>>>%d",eCode);
  141.     switch (eCode) 
  142. {
  143.         // App is told it is starting up
  144.         case EVT_APP_START:         
  145. IWINMINE_DrawIntroScreen(pMe->m_pMine);
  146. if(!ISNOWMENU_Start(pMe->m_pSnowMenu))
  147. {
  148. pMe->m_State=STATE_MINE;
  149. IWINMINE_Start(pMe->m_pMine);
  150. }
  151. else
  152. pMe->m_State=STATE_MENU;
  153.             return(TRUE);
  154.         // App is told it is exiting
  155.         case EVT_APP_STOP:
  156.             // Add your code here...
  157.        return(TRUE);
  158.         // App is being suspended 
  159.         case EVT_APP_SUSPEND:
  160. pMe->m_State=STATE_NOTHING;
  161. IWINMINE_Pause(pMe->m_pMine);
  162. IMINEPLAY_Stop(pMe->m_Play);
  163. ISNOWMENU_Stop (pMe->m_pSnowMenu);
  164.        return(TRUE);
  165.         // App is being resumed
  166.         case EVT_APP_RESUME:
  167. pMe->m_State=STATE_MINE;
  168. IWINMINE_Start(pMe->m_pMine);
  169.        return(TRUE);
  170.         // An SMS message has arrived for this app. Message is in the dwParam above as (char *)
  171.         // sender simply uses this format "//BREW:ClassId:Message", example //BREW:0x00000001:Hello World
  172.         case EVT_APP_MESSAGE:
  173.     // Add your code here...
  174.        return(TRUE);
  175. case EVT_APP_NO_SLEEP:
  176. if(STATE_MENU==pMe->m_State)
  177. return TRUE;
  178. else
  179. return FALSE;
  180.         // A key was pressed. Look at the wParam above to see which key was pressed. The key
  181.         // codes are in AEEVCodes.h. Example "AVK_1" means that the "1" key was pressed.
  182.         case EVT_KEY:
  183. switch(pMe->m_State)
  184. {
  185. case STATE_MENU:
  186. return  ISNOWMENU_HandleKeyEvent(pMe->m_pSnowMenu,wParam);
  187. case STATE_VEDIO:
  188. if(AVK_SOFT1==wParam)
  189. IMINEPLAY_Start(pMe->m_Play);
  190. break;
  191. case STATE_SCORE:
  192. if(!ISNOWMENU_Start(pMe->m_pSnowMenu))
  193. {
  194. pMe->m_State=STATE_NOTHING;
  195. return FALSE;
  196. }
  197. else
  198. pMe->m_State=STATE_MENU;
  199. break;
  200. case STATE_MINE:
  201. if(AVK_SOFT1==wParam)
  202. {
  203. IWINMINE_Pause(pMe->m_pMine);
  204. if(IMINEPLAY_Start(pMe->m_Play))
  205. {
  206. pMe->m_State=STATE_VEDIO;
  207. }
  208. else
  209. pMe->m_State=STATE_NOTHING;
  210. }
  211. else
  212. {
  213. boolean ret=IWINMINE_HandleEvent(pMe->m_pMine,wParam);
  214. if((FALSE==ret)&&(AVK_CLR==wParam||AVK_SOFT2==wParam))
  215. {
  216. IWINMINE_Pause(pMe->m_pMine);
  217. if(!ISNOWMENU_Start(pMe->m_pSnowMenu))
  218. {
  219. pMe->m_State=STATE_NOTHING;
  220. return FALSE;
  221. }
  222. else
  223. pMe->m_State=STATE_MENU;
  224. }
  225. }
  226. break;
  227. default:
  228. return FALSE;
  229. }
  230. return TRUE;
  231.         // If nothing fits up to this point then we'll just break out
  232.         case EVT_USER:
  233. switch(wParam)
  234. {
  235. case CMD_MENUSCORE:
  236. pMe->m_State=STATE_SCORE;
  237. Winmine_DrawScore(pMe);
  238. break;
  239. case CMD_MENUEXIT:
  240. pMe->m_State=STATE_NOTHING;
  241. ISHELL_CloseApplet(pMe->pIShell,FALSE);
  242. break;
  243. case CMD_MENUSTART:
  244. case CMD_RESTART:
  245. pMe->m_State=STATE_MINE;
  246. IWINMINE_Start(pMe->m_pMine);
  247. }
  248. return TRUE;
  249.         default:
  250.             break;
  251.    }
  252.    return FALSE;
  253. }
  254. // this function is called when your application is starting up
  255. boolean Winmine_InitAppData(Winmine* pMe)
  256. {
  257. AEERect rt;
  258.     // Get the device information for this handset.
  259.     // Reference all the data by looking at the pMe->DeviceInfo structure
  260.     // Check the API reference guide for all the handy device info you can get
  261.     pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
  262.     ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);
  263.     // The display and shell interfaces are always created by
  264.     // default, so we'll asign them so that you can access
  265.     // them via the standard "pMe->" without the "a."
  266.     pMe->pIDisplay = pMe->a.m_pIDisplay;
  267.     pMe->pIShell   = pMe->a.m_pIShell;
  268.     // Insert your code here for initializing or allocating resources...
  269. pMe->m_pMine=IWINMINE_CreateInstance();
  270. if(!pMe->m_pMine)
  271. return FALSE;
  272. IWINMINE_GetPlayRect(pMe->m_pMine,&rt);
  273. rt.x+=2;
  274. rt.y+=2;
  275. rt.dx-=4;
  276. rt.dy-=4;
  277. pMe->m_Play=IMINEPLAY_CreateInstance(&rt);
  278. pMe->m_pSnowMenu=ISNOWMENU_CreateInstance();
  279. pMe->m_State=STATE_NOTHING;
  280.     // if there have been no failures up to this point then return success
  281.     return TRUE;
  282. }
  283. // this function is called when your application is exiting
  284. void Winmine_FreeAppData(Winmine* pMe)
  285. {
  286. pMe->m_State=STATE_NOTHING;
  287. if(pMe->m_pMine)
  288. {
  289. IWINMINE_Release(pMe->m_pMine);
  290. pMe->m_pMine=NULL;
  291. }
  292. if(pMe->m_Play)
  293. {
  294. IMINEPLAY_Release(pMe->m_Play);
  295. pMe->m_Play=NULL;
  296. }
  297. if(pMe->m_pSnowMenu)
  298. {
  299. ISNOWMENU_Release(pMe->m_pSnowMenu);
  300. pMe->m_pSnowMenu=NULL;
  301. }
  302. }
  303. static void Winmine_Number2WSTR(int n,AECHAR* p,int nSize)
  304. {
  305. char q[16];
  306. SPRINTF(q,"%d",n);
  307. MEMSET((char*)p,0,nSize);
  308. STRTOWSTR(q,p,nSize);
  309. }
  310. static void Winmine_DrawScore(Winmine* pMe)
  311. {
  312. TScore score;
  313. AEERect rt;
  314. int x,y,z;
  315. AECHAR wBuf[16]; 
  316. IImage* pImage;
  317. AEEImageInfo info;
  318. RGBVAL col;
  319. uint32 flag=IDF_ALIGN_LEFT|IDF_ALIGN_TOP|IDF_TEXT_TRANSPARENT;
  320. //get data
  321. if(SUCCESS!=ISHELL_GetAppPrefs(pMe->pIShell,1,&score,sizeof(TScore)))
  322. return;
  323. //background
  324. pImage=ISHELL_LoadImage(pMe->pIShell,"menuimg/score.bmp");
  325. if(!pImage)
  326. return;
  327. IIMAGE_GetInfo(pImage,&info);
  328. x=(pMe->DeviceInfo.cxScreen-info.cx)/2;
  329. y=(pMe->DeviceInfo.cyScreen-info.cy)/3;
  330. IIMAGE_Draw(pImage,x,y);
  331. IIMAGE_Release(pImage);
  332. //showdata
  333. col= IDISPLAY_SetColor(pMe->pIDisplay,CLR_USER_TEXT,MAKE_RGB(10,255,0));
  334. z=2*IDISPLAY_GetFontMetrics(pMe->pIDisplay,AEE_FONT_BOLD,NULL,NULL);
  335. //score
  336. rt.x=x+info.cx/2;
  337. rt.y=y+info.cy/3;
  338. rt.dy=z;
  339. rt.dx=rt.dy*2;
  340. Winmine_Number2WSTR(score.m_nScore,wBuf,sizeof(wBuf));
  341. IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,wBuf,-1,0,0,&rt,flag);
  342. y+=33*info.cy/48;
  343. //month
  344. rt.x=x+info.cx/12;
  345. rt.y=y;
  346. rt.dy=z;
  347. rt.dx=rt.dy*2;
  348. Winmine_Number2WSTR(score.m_Date.wMonth,wBuf,sizeof(wBuf));
  349. IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,wBuf,-1,0,0,&rt,flag);
  350. //day
  351. rt.x=x+13*info.cx/48;
  352. rt.y=y;
  353. rt.dy=z;
  354. rt.dx=rt.dy*2;
  355. Winmine_Number2WSTR(score.m_Date.wDay,wBuf,sizeof(wBuf));
  356. IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,wBuf,-1,0,0,&rt,flag);
  357. //hour
  358. rt.x=x+info.cx/2;
  359. rt.y=y;
  360. rt.dy=z;
  361. rt.dx=rt.dy*2;
  362. Winmine_Number2WSTR(score.m_Date.wHour,wBuf,sizeof(wBuf));
  363. IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,wBuf,-1,0,0,&rt,flag);
  364. //minute
  365. rt.x=x+9*info.cx/12;
  366. rt.y=y;
  367. rt.dy=z;
  368. rt.dx=rt.dy*2;
  369. Winmine_Number2WSTR(score.m_Date.wMinute,wBuf,sizeof(wBuf));
  370. IDISPLAY_DrawText(pMe->pIDisplay,AEE_FONT_NORMAL,wBuf,-1,0,0,&rt,flag);
  371. //update
  372. IDISPLAY_SetColor(pMe->pIDisplay,CLR_USER_TEXT,col);
  373. IDISPLAY_Update(pMe->pIDisplay);
  374. }