⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sweekscreen.c

📁 brew开发的日历程序 完全模仿mediaplayer的结构设计 值得初学者学习
💻 C
字号:
/**
 * File Name    : SweekScreen.c                                                                 
 * Created      : 07/04/12                                                                       
 * Author       : ZhongNingLin@neusoft.com                                                                    
 * Model        : 05YOP                                                                           
 * Description  : [[CN]] 此文件的职责是: [[CN]]                           
**/

#include "sweekscreen.h"

/**************************************************************************
*	Function Name	 :	CWeekWin_New                                            
*	Description		 :	This function constructs weekly window.
*	Input Parameters :	Schedule* 								
*	Output Parameters:	None												
*	Return Value	 :	IWindow *			
*	Date			 :	2007/04/11											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
IWindow *  CWeekWin_New(Schedule * pOwner)
{
	CWeekWin *        pMe;
    VTBL(IWindow)     vtbl;
	IDateCtl *dateCtl = NULL;

	SH_IWINDOW_SETVTBL(&vtbl, CWeekWin_Enable, CWeekWin_Redraw, CWeekWin_HandleEvent, CWeekWin_Delete);
	pMe = (CWeekWin *)CWindow_New(sizeof(CWeekWin), pOwner, &vtbl);	
	if(NULL == pMe)
	{
		return FALSE;
	}
    /*初始化日期*/
    if( (ISHELL_CreateInstance (pMe->m_pIShell,AEECLSID_DATECTL,(void * *)&dateCtl)) == SUCCESS )
	{
		IDATECTL_SetDate(dateCtl,pMe->m_pOwner->m_year,pMe->m_pOwner->m_month,pMe->m_pOwner->m_day); 

		/*得到日期的星期值*/
	    pMe->dayOfweek = IDATECTL_GetDayOfWeek(dateCtl);
		/*释放资源*/
	    ReleaseObj( (void **)&dateCtl);
	}
	/*初始化菜单*/
	if((ISHELL_CreateInstance
		(
		 pOwner->a.m_pIShell, 
		 AEECLSID_MENUCTL, 
		 (void**)(&pMe->m_pMenuCtl)
		) != SUCCESS)
	  )
	  return FALSE;

	/*初始化目录矩形变量*/
	SETAEERECT( &pMe->rectMenu, 0, 35, pOwner->m_width,pOwner->m_height-50 );

	/*初始化星期目录*/
	SWeekInitMenu(pMe);
	pMe->m_year  = pMe->m_pOwner->m_year;
	pMe->m_month = pMe->m_pOwner->m_month;
	pMe->m_day   = pMe->m_pOwner->m_day;
	/*当前月的天数*/
	pMe->m_days  = ScheWeek_getMonthDays(pMe->m_pOwner->m_year ,pMe->m_month);

	/*返回窗体接口*/
    return (IWindow *)pMe;

}
/**************************************************************************
*	Function Name	 :	CWeekWin_Delete                                            
*	Description		 :	释放资源
*	Input Parameters :	IWindow* 								
*	Output Parameters:	None												
*	Return Value	 :	None			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void SWeekInitMenu(CWeekWin* pme)
{	 
	 /*设置菜单外观属性*/
	 SH_SetMenuAttr(
		             pme->m_pMenuCtl, 
		             AEECLSID_MENUCTL, 
		             MAKE_RGB(255,0,0),
		             &pme->rectMenu, 
		             MP_MAXSOFTKEYITEMS
		 );
     /*向菜单中添加目录*/
	 ScheWeek_addItemToMenu(pme ,(uint8)(pme->dayOfweek +1));
	 /*设置菜单的属性*/
	 IMENUCTL_SetProperties(pme->m_pMenuCtl,MP_WRAPSCROLL); 
	 
}

/**************************************************************************
*	Function Name	 :	CWeekWin_Delete                                            
*	Description		 :	释放资源
*	Input Parameters :	IWindow* 								
*	Output Parameters:	None												
*	Return Value	 :	None			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void CWeekWin_Delete(IWindow * po)
{
    CWeekWin *  pme = (CWeekWin *)po;
	/*reset the date of main*/
	{
		pme->m_pOwner->m_year  = pme->m_year;
		pme->m_pOwner->m_month = pme->m_month;
		pme->m_pOwner->m_day   = pme->m_day;
	}
	/*free menuCtl*/	
	ReleaseObj( (void **)&pme->m_pMenuCtl);
   
	FREEIF(pme);	
}

/**************************************************************************
*	Function Name	 :	CWeekWin_Enable                                            
*	Description		 :	enable current window
*	Input Parameters :	IWindow * po, boolean bEnable						
*	Output Parameters:	None												
*	Return Value	 :	None			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void CWeekWin_Enable(IWindow * po, boolean bEnable)
{
   CWeekWin *  pme = (CWeekWin *)po;

   if (!CWindow_ProcessEnable(po, bEnable))
      return;
   /*判断当前窗口是否为激活状态*/
   if (!pme->m_bActive)
   {      
      return;
   }
}

/**************************************************************************
*	Function Name	 :	CWeekWin_Redraw                                            
*	Description		 :	This function redraws the menu window.
*	Input Parameters :	IWindow* 								
*	Output Parameters:	None												
*	Return Value	 :	None			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void  CWeekWin_Redraw(IWindow * po)
{
   CWeekWin *  pme = (CWeekWin *)po;

   if (!pme->m_bActive)
      return;

   IDISPLAY_ClearScreen(pme->m_pIDisplay); 

   IMENUCTL_SetActive(pme->m_pMenuCtl,TRUE);   
   IMENUCTL_Redraw(pme->m_pMenuCtl);  
   /*绘制日期*/
   ScheWeek_DrawDate(pme);
   /*绘制头图象*/
   SH_DRAWHEADER(pme);   
   /*draw the button on bottom of screen*/
   ScheWeek_drawButton(pme);

   IDISPLAY_Update(pme->m_pIDisplay);
}

/**************************************************************************
*	Function Name	 :	CWeekWin_HandleEvent                                            
*	Description		 :	handle current window events
*	Input Parameters :	IWindow * , AEEEvent , uint16 , uint32 							
*	Output Parameters:	None												
*	Return Value	 :	boolean			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
boolean CWeekWin_HandleEvent(IWindow * po, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{	
	CWeekWin *  pme = (CWeekWin *)po;

	IMENUCTL_HandleEvent(pme->m_pMenuCtl, eCode, wParam, dwParam);

	/*process the clr_key events*/
	if (SH_ISCLR(eCode) )
    {
      /*back to main window*/
      Schedule_SetWindow(pme->m_pOwner, APP_MAIN_WIN, 0);
      return TRUE;
    }

	/*process the key events*/
	if (SH_ISEVTKEY(eCode))
	{		
		switch(eCode)
		{
		case EVT_KEY:			  
			switch(wParam)
			{
			case AVK_UP:
				ScheWeek_updateScreen(pme ,UP);					 
				break;
			case AVK_DOWN:
				ScheWeek_updateScreen(pme ,DOWN);					
				break;	
			case AVK_SOFT1:
				//APP_STATE_MENUDISP date select /event view /event creat			            
				Schedule_SetWindow(pme->m_pOwner, APP_STATE_MENUDISP, 0); 
				return TRUE;
			case AVK_SOFT2:
				/*back to main window*/
				Schedule_SetWindow(pme->m_pOwner, APP_MAIN_WIN, 0);
				return TRUE;
			case AVK_SELECT:	   
				/*back to oneday event window*/		            
			    Schedule_SetWindow(pme->m_pOwner, APP_STATE_ONEDAYDISP, 0); 
				return TRUE;
			default:
				break;
			}//end of switch( wParam )
			default:
				return FALSE;
		}//end of switch( eCode )		
		
	}// end of if SH_ISEVTKEY(eCode)
	
	return FALSE;
}

/**************************************************************************
*	Function Name	 :	ScheWeek_updateScreen                                            
*	Description		 :	update the weekly screen
*	Input Parameters :	CWeekWin*  ,uint8 						
*	Output Parameters:	None												
*	Return Value	 :	boolean			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void ScheWeek_updateScreen(CWeekWin* pme ,uint8 direction)
{
	uint8  day   = pme->m_day;
	uint8  month = pme->m_month;
	uint8  days  = ScheWeek_getMonthDays(pme->m_pOwner->m_year,pme->m_month);	
	uint16 year  = pme->m_year;

	switch(direction)
	{
	    case   UP:
			if( (day - 1) < 1)/*判断是否是这个月的第一天*/
			{				
				if( (month - 1) < 1)/*判断是否是这一年的第一个月*/
				{					
					pme->m_month = 12;
					pme->m_day   = 31;
					pme->m_year -= 1;
				}
				else
				{			
					pme->m_month -= 1;
					/*这个月的天数*/
					pme->m_day   = ScheWeek_getMonthDays(pme->m_pOwner->m_year,pme->m_month);					
				}					
			}
			else
				pme->m_day -= 1;
			break;

		case DOWN:
			if( (day + 1) > days)
			{				
				if( (month + 1) > 12)
				{
					pme->m_month =  1;
					pme->m_day   =  1;
					pme->m_year +=  1;
				}
				else
				{
					pme->m_month += 1;
					pme->m_day    = 1;
				}	
				
			}
			else
				pme->m_day += 1;
			break;
			
	}
    
	ScheWeek_DrawDate(pme);
}

/**************************************************************************
*	Function Name	 :	ScheWeek_addItemToMenu(CWeekWin* pme ,uint8 week)                                       
*	Description		 :	handle current window events
*	Input Parameters :	IWindow * , AEEEvent , uint16 , uint32 							
*	Output Parameters:	None												
*	Return Value	 :	boolean			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void ScheWeek_addItemToMenu(CWeekWin* pme ,uint8 week)
{
	uint8 weekDay  = 1;
	uint8 weekDayT = 1;
	for(weekDay = week; weekDay <= 7; weekDay++)
	{
		SH_AddMenuItem(pme->m_pMenuCtl, weekDay, NULL, weekDay, weekDay,0);
	}
	for(weekDayT = 1; weekDayT < week; weekDayT++)
	{
		SH_AddMenuItem(pme->m_pMenuCtl, weekDayT, NULL, weekDayT, weekDayT,0);
	}
}

/**************************************************************************
*	Function Name	 :	ScheWeek_drawButton                              
*	Description		 :	draw the button on bottom of screen
*	Input Parameters :	CWeekWin* pMe			
*	Output Parameters:	None												
*	Return Value	 :	boolean			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void ScheWeek_drawButton(CWeekWin* pMe)
{
	AEERect  rect;
	const AECHAR switchT[] = { 0x6d4f, 0x89c8, 0 }; //浏览	
	const AECHAR option[] = { 0x64cd, 0x4f5c, 0 }; //操作
    /*字符宽度*/
	int fontWi = 0;
	int fontHe = 0;
	fontWi = IDISPLAY_MeasureText( pMe->m_pIDisplay, AEE_FONT_NORMAL, switchT ); 
    /*文字的高度*/
	fontHe  = IDISPLAY_GetFontMetrics( pMe->m_pIDisplay,AEE_FONT_NORMAL,NULL,NULL ); 
	SETAEERECT( &rect, 0, pMe->m_pOwner->DeviceInfo.cyScreen - fontHe, pMe->m_pOwner->DeviceInfo.cxScreen,fontHe);
	/*填充矩形的颜色*/
	IDISPLAY_FillRect(pMe->m_pIDisplay,&rect,RECT_BACKGROUND); 

	IDISPLAY_DrawText(pMe->m_pIDisplay,AEE_FONT_NORMAL,option,-1,0,
		pMe->m_pOwner->DeviceInfo.cyScreen-15,NULL,IDF_TEXT_TRANSPARENT);
	IDISPLAY_DrawText(pMe->m_pIDisplay,AEE_FONT_NORMAL,switchT,-1,
		pMe->m_pOwner->DeviceInfo.cxScreen-fontWi,
		pMe->m_pOwner->DeviceInfo.cyScreen-15,NULL,IDF_TEXT_TRANSPARENT);
}

/**************************************************************************
*	Function Name	 :	ScheWeekDateDisp_DrawCusor                                            
*	Description		 :	handle current window events
*	Input Parameters :	CWeekWin * 					
*	Output Parameters:	None												
*	Return Value	 :	boolean			
*	Date			 :	2007/04/12											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void ScheWeek_DrawDate(CWeekWin* pMe)
{	
	AECHAR space[4]={' ','\0'};
    AECHAR sYear[10]={' ','\0'};
    AECHAR sMonth[10]={' ','\0'};
    AECHAR sDay[10]={' ','\0'};
	AECHAR sDate[30] = {' ','\0'};
	AEERect  rect;
	int fontHe = 0;
	int fontWi = 0;			

	WWRITELONG(sYear, pMe->m_year);
    STRTOWSTR("-",space,4);
    WWRITELONG(sMonth, pMe->m_month);
	WWRITELONG(sDay,pMe->m_day);

	WSTRCAT(sDate,sYear); 
	WSTRCAT(sDate,space); 
	WSTRCAT(sDate,sMonth); 
	WSTRCAT(sDate,space); 
	WSTRCAT(sDate,sDay); 		

	/*字体的高度*/
    fontHe  = IDISPLAY_GetFontMetrics( pMe->m_pIDisplay,AEE_FONT_NORMAL,NULL,NULL ); 
	fontWi  = IDISPLAY_MeasureText( pMe->m_pIDisplay, AEE_FONT_NORMAL, sDate ); 
 
    rect.x  = 0;
    rect.y  = 20;
    rect.dx = pMe->m_pOwner->DeviceInfo.cxScreen;
    rect.dy = fontHe;
    /*填充矩形的颜色*/
	IDISPLAY_FillRect(pMe->m_pIDisplay,&rect,RECT_BACKGROUND); 
	//AEE_FONT_BOLD+1
	IDISPLAY_DrawText(pMe->m_pIDisplay,AEE_FONT_NORMAL,sDate,-1,rect.dx/2 - fontWi/2,20,NULL,IDF_TEXT_TRANSPARENT);

}

/**************************************************************************
*	Function Name	 :	ReleaseObj                                            
*	Description		 :	释放资源
*	Input Parameters :	void *** 								
*	Output Parameters:	None												
*	Return Value	 :	None			
*	Date			 :	2007/04/11											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
void ReleaseObj(void ** ppObj)
{
   if ( ppObj && *ppObj ) 
   {
      (void)IBASE_Release(((IBase *)*ppObj));
      *ppObj = NULL;
   }
}

/**************************************************************************
*	Function Name	 :	ScheWeek_getMonthDays                                            
*	Description		 :	计算指定的月有几天
*	Input Parameters :	uint8 								
*	Output Parameters:	None												
*	Return Value	 :	uint8			
*	Date			 :	2007/04/11											
*	Author			 :	ZhongNingLin@neusoft.com              								
***************************************************************************/
uint8 ScheWeek_getMonthDays(uint16 year,uint8 month)
{
uint8 monthDays = 0;

	if(month < 1 || month > 12)
		return monthDays;

	if(month == 2)
	{
		/*判断闰年*/
		if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 )
			monthDays = 29;
		else	
	        monthDays = 28;	
		return monthDays;
	}
	else if(month % 2 != 0)
		 monthDays = 31;
	else monthDays = 30;
	
	return monthDays;
}
//------------------end of file---------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -