asix_tb.c

来自「一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上」· C语言 代码 · 共 449 行

C
449
字号
/*************************************************************************
*
* Copyright  2000 National ASIC Center, All right Reserved
*
* FILE NAME:			asix_tb.c
* PROGRAMMER:			longn_qi
* Date of Creation:		2002/09/06
* 
* DESCRIPTION: 			The asix win task bar control implementation. this 
*						file defines the control related infomation. 
*
* NOTE:			 		
*
* FUNCTIONS LIST:
* tb_create
* tb_destroy
* tb_caption
* tb_msgtrans
* tb_msgproc
* tb_enable
*
* GLOBAL VARS LIST:
* 
*
**************************************************************************
* MODIFICATION HISTORY
*
* 2002/09/06	by longn_qi		Creation of this file
*								
*							
*************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys\wintype.h>

#include <asixwin.h>
#include <asixapp.h>

#include <asixwin\asix_tb.h>
#include <asixwin\asix_mn.h>

#include <resource\bitmap.h>

static STATUS DrawsTaskBar( struct tb_ctrl	*ctrl_ptr );	

extern DWORD 	EveryMinuteTimer;
extern TASKDESCRIPTION CnfgDTTskDesp;

static char	time_caption[21];

struct MENU_ITEM	TaskManageMenu[MAX_TASK_MN_ITEM] = 
{
	{	1,	1,	"任务管理"	},
	{	0,	0,	NULL		}
};

TASKDESCRIPTION	*ShortcutTask[MAX_SHORTCUT_TASK_NUM] =
{
	NULL
};

U8	ShortcutTaskNum = 0;

STATUS tb_create(char *caption, U32 style, U16 x, U16 y, U16 width, U16 height,
				 U32 wndid, U32 menu, void **ctrl_str, void *exdata)
{
	struct tb_ctrl	*ctrl_ptr;
	U32		pGC;
	char	*icon = (char *)zi_imme;
	U16		tx;

//	if ( (U16)(x+width-1)>=ASIX_LCD_W || (U16)(y+height-1)>=ASIX_LCD_H )
//		return ASIX_ERROR;
	
	pGC = GetGC( );
	
	ctrl_ptr = Lcalloc( sizeof(struct tb_ctrl) );
	
	if ( ctrl_ptr == NULL )
		return ASIX_NO_MEM;
	
	ctrl_ptr->classid = WNDCLASS_TSKBAR;
	ctrl_ptr->wndid = wndid;
	ctrl_ptr->width = PHY_LCD_W;
	ctrl_ptr->height = 20;
	ctrl_ptr->x = 0;
	ctrl_ptr->y = PHY_LCD_H-20;
	ctrl_ptr->style = style;

	ClearRec( pGC, ColorTheme.obj3D, ctrl_ptr->x, ctrl_ptr->y, ctrl_ptr->width, ctrl_ptr->height, GPC_REPLACE_STYLE );
	
	tx = ctrl_ptr->x;
	if( style & TBS_TASKMENU )
	{
		U16	menu_x, menu_y, menu_w = 18, menu_h = ctrl_ptr->height-2;
		
		menu_x = tx + 1;
		menu_y	= ctrl_ptr->y + 1;
		tx += menu_w + 1;
		ctrl_ptr->taskMenu = CreateWindow( WNDCLASS_MENU, icon, WS_CHILD | MNS_ICON | MNS_TRANSPARENT, menu_x, menu_y, menu_w, menu_h, wndid, 0, TaskManageMenu );
	}
	else
		ctrl_ptr->taskMenu = 0;

	tx = ctrl_ptr->x + ctrl_ptr->width;
	if( style & TBS_CLOCK )
	{
		U16	clock_x, clock_y, clock_w = 5*ENGLISH_CHAR_WIDTH+6, clock_h = ctrl_ptr->height-2;
		
		tx -= clock_w;
		clock_x = tx;
		clock_y	= ctrl_ptr->y+1;
		ctrl_ptr->clock = CreateWindow( WNDCLASS_BUTTON, NULL, WS_CHILD | BS_PEN_UP_CMD, clock_x, clock_y, clock_w, clock_h, wndid, 0, NULL );
		EnableFocus( ctrl_ptr->clock, FALSE );
	}
	else
		ctrl_ptr->clock = 0;
		
	if( style & TBS_POWER )
	{
		U16	power_x, power_y, power_w = 36, power_h = ctrl_ptr->height-2;
		
		tx -= power_w;
		power_x = tx;
		power_y	= ctrl_ptr->y+1;
		ctrl_ptr->power = CreateWindow( WNDCLASS_BUTTON, NULL, WS_CHILD | BS_PEN_UP_CMD | BS_TRANSPARENT, power_x, power_y, power_w, power_h, wndid, 0, (void *)zi_dianliang );
		EnableFocus( ctrl_ptr->power, FALSE );
	}
	else
		ctrl_ptr->power = 0;

	if( style & TBS_SIGNAL )
	{
		U16	signal_x, signal_y, signal_w = 36, signal_h = ctrl_ptr->height-2;
		
		tx -= signal_w;
		signal_x = tx;
		signal_y = ctrl_ptr->y+1;
		ctrl_ptr->signal = CreateWindow( WNDCLASS_BUTTON, NULL, WS_CHILD | BS_PEN_UP_CMD | BS_TRANSPARENT, signal_x, signal_y, signal_w, signal_h, wndid, 0, (void *)zi_xinhao );
		EnableFocus( ctrl_ptr->signal, FALSE );
	}
	else
		ctrl_ptr->signal = 0;

	if ( DrawsTaskBar( ctrl_ptr ) != ASIX_OK )
		return ASIX_ERROR;		
		
	*ctrl_str = (void *)ctrl_ptr;
	
	return ASIX_OK;
	
}


STATUS tb_destroy(void *ctrl_str)
{
	struct tb_ctrl *ctrl_ptr;
	ASIX_WINDOW		*wndptr;
	U32				pGC;

	pGC =GetGC();
	
	ctrl_ptr = (struct tb_ctrl *)ctrl_str;
	wndptr = (ASIX_WINDOW *)(ctrl_ptr->wndid);
	
//	ClearRec( pGC,ColorTheme.form_backcolor, wndptr->x, wndptr->y, wndptr->width, wndptr->hight, GPC_REPLACE_STYLE );

	
	Lfree(ctrl_ptr);
	
	
	return ASIX_OK;
	
}		

STATUS tb_msgproc(U32 win_id, U16 asix_msg, U32 lparam, void *data, U16 wparam, void *reserved)
{
	struct tb_ctrl	*ctrlstr;
	ASIX_WINDOW		*wndptr;
	MSG				switchmsg;

	wndptr = (ASIX_WINDOW *)win_id;
	if( wndptr == NULL )
		return ASIX_ERROR;
	if( wndptr->wndclass == NULL || wndptr->wndclass->wndclass_id != WNDCLASS_TSKBAR )
		return ASIX_ERROR;
	
	ctrlstr = (struct tb_ctrl *)wndptr->ctrl_str;

	switch( asix_msg )
	{
		case WM_TIMER:
			if( lparam == EveryMinuteTimer )
			{
				ASIX_TIME	time;

				GetTime( &time );
				sprintf( time_caption, "%02d:%02d", time.hour, time.minute );
				SetWindowText( ctrlstr->clock, time_caption, NULL );
			}
			break;
		case WM_COMMAND:
			if( lparam == ctrlstr->taskMenu )
			{
				U8	i;

				if( wparam == 0 )	// 选择任务管理
				{
				}
				else
				{
					for( i = 1; i <= ShortcutTaskNum; i++ )	// 选择快捷方式
					{
						if( wparam == i )
						{
							TASKDESCRIPTIONLIST	*desplst;
							TASKDESCRIPTION		*desp = ShortcutTask[i-1];
							SYSTCB	*taskptr;

							desplst = IsRegistered( desp );
							if( desplst != NULL )		// already registered
							{
								taskptr = &gSysTcbTbl[desplst->taskid-1];
								if( taskptr->status == RUNNING )	// already run
								{									
									switchmsg.message = SM_SWITCH;
									switchmsg.wparam = SWAP_TO_FOREGROUND;
									switchmsg.lparam = desplst->taskid;
									SysSendMessage( SYSTASK_ID, &switchmsg );
									break;
								}
							}
							else
							{
								desplst = TaskRegist( desp );
								if( desplst == NULL )
								{
									MessageBox(GetFocus(), "任务启动失败!可能是内存不够,请关闭一些任务后再试。","任务启动失败",MB_OK | MB_ICONSTOP);
									break;
								}
							}
							ASIXStartTask( desplst->taskid );
							break;
						}
					}
				}
			}
			else if( lparam == ctrlstr->clock )
			{
				U32	id;
				U32 old_owner;

				old_owner = (U32)gLcdOwnerTskId;
				id = CreateDynamicTask( &CnfgDTTskDesp, RUN_AS_EXISTED_TASK );
				if( id == old_owner )	// 时间显示窗口已在前台
				{
					// 关闭时间显示窗口
					switchmsg.message = WM_QUIT;
					switchmsg.lparam = 0;
					SysSendMessage( id, &switchmsg );
				}
				else	// 时间显示窗口在后台
				{
					// 切换时间显示窗口到前台
					switchmsg.message = SM_SWITCH;
					switchmsg.wparam = SWAP_TO_FOREGROUND;
					switchmsg.lparam = id;
					SysSendMessage( SYSTASK_ID, &switchmsg );
				}
			}
			break;
		case SM_SWITCH:
			if( wparam == SWAP_TO_FOREGROUND )
				DrawsTaskBar( ctrlstr );
			break;
		default:
			return ASIX_ERROR;
	}

	return ASIX_OK;	
}

STATUS tb_msgtrans(void *ctrl_str, U16 msg_type, U32 areaId, P_U16 data, U32 size, PMSG trans_msg)
{
	struct tb_ctrl  *ctrlptr;
	
	ctrlptr = (struct tb_ctrl *)ctrl_str;
	if ( ctrlptr == NULL || ctrlptr->classid != WNDCLASS_TSKBAR )
		return ASIX_ERROR;

	if ( ctrlptr->wndid != areaId )
		return ASIX_NO_MSG;

	return ASIX_OK;
}

STATUS tb_repaint(void *ctrl_str, U32 lparam)
{	
//	ASIX_WINDOW		*wndptr;
	struct tb_ctrl  *ctrlptr;
	U32		hGC;
	
	ctrlptr = (struct tb_ctrl *)ctrl_str;
	if ( ctrlptr == NULL || ctrlptr->classid != WNDCLASS_TSKBAR ) return ASIX_ERROR;

//	wndptr = (ASIX_WINDOW *)(ctrlptr->wndid);
	
	hGC = GetGC();
	ClearRec( hGC, ColorTheme.obj3D, ctrlptr->x, ctrlptr->y, ctrlptr->width, ctrlptr->height, GPC_REPLACE_STYLE );
	if ( DrawsTaskBar( ctrlptr ) == ASIX_ERROR )
		return ASIX_ERROR;		
		
	return ASIX_OK;
}

STATUS tb_caption(void *ctrl_str, char *caption, void *exdata)
{
//	ASIX_WINDOW		*wndptr;
	struct tb_ctrl  *ctrlptr;
	
	if ( ctrl_str == NULL || *((U32 *)ctrl_str) != WNDCLASS_STATIC ) return ASIX_ERROR;
	
	ctrlptr = (struct tb_ctrl *)ctrl_str;
//	wndptr = (ASIX_WINDOW *)(ctrlptr->wndid);
		
	if ( DrawsTaskBar( ctrlptr ) != ASIX_OK )
		return ASIX_ERROR;		
	
	return ASIX_OK;	
}

STATUS tb_enable(void *ctrl_str, U8 enable)
{

	return ASIX_OK;	
}

STATUS DrawsTaskBar( struct tb_ctrl	*ctrl_ptr )
{
	U32		pGC;
	U16		xSrc = ctrl_ptr->x, ySrc = ctrl_ptr->y;
	U16		xDes = ctrl_ptr->x + ctrl_ptr->width -1, yDes = ctrl_ptr->y + ctrl_ptr->height -1;
		
	pGC = GetGC();
	
	if( ctrl_ptr->style & TBS_CLOCK )
	{
		ASIX_TIME	time;
		ASIX_DATE	date;

		GetTime( &time );
		GetDate( &date );
		sprintf( time_caption, "%02d:%02d\\%d年%d月%d日", time.hour, time.minute, date.year, date.month, date.day );
		SetWindowText( ctrl_ptr->clock, time_caption, NULL );
	}
	
	return ASIX_OK;
}

U32	GetTaskBar( U32 wndid )
{
	ASIX_WINDOW	*parent = (ASIX_WINDOW *)wndid;
	ASIX_WINDOW	*child;
	U32			id;

	if( parent == NULL )
		return 0;
	
	if( parent->wndclass->wndclass_id == WNDCLASS_TSKBAR )
		return wndid;

	child = parent->child;
	while( child != NULL )
	{
		id = GetTaskBar( (U32)child );
		if( id != 0 )	// find the taskbar
			return id;
		child = child->next;
	}

	return 0;
}

STATUS Add2ShortcutTask( TASKDESCRIPTION *desp )
{
	struct MENU_ITEM	menu_item = { ICON_ENABLE, UNUNDERLINE, NULL }, end_item = { ICON_END, UNUNDERLINE, NULL };

	if( desp == NULL || ShortcutTaskNum == MAX_TASK_MN_ITEM )
		return ASIX_ERROR;

	ShortcutTask[ShortcutTaskNum] = desp;
	ShortcutTaskNum++;

	menu_item.item_text = desp->name;
	memcpy( &TaskManageMenu[ShortcutTaskNum], &menu_item, sizeof(struct MENU_ITEM) );
	memcpy( &TaskManageMenu[ShortcutTaskNum+1], &end_item, sizeof(struct MENU_ITEM) );

	return ASIX_OK;
}

STATUS AdjustTskBarTime( U32 tskbar )
{
	ASIX_WINDOW	*wndptr = (ASIX_WINDOW *)tskbar;
	struct tb_ctrl  *ctrlptr;

	if( wndptr == NULL )
		return ASIX_ERROR;

	if( wndptr->wndclass->wndclass_id != WNDCLASS_TSKBAR )
		return ASIX_ERROR;

	ctrlptr = (struct tb_ctrl *)wndptr->ctrl_str;
	if( ctrlptr->style & TBS_CLOCK )
	{
		ASIX_TIME	time;

		GetTime( &time );
		sprintf( time_caption, "%02d:%02d", time.hour, time.minute );
		SetWindowText( ctrlptr->clock, time_caption, NULL );
	}
	
	return ASIX_OK;
}

U32 AddBtn2TskBar( U32 tbid, char *caption, U32 style, U16 width, void *exdata )
{
	U32	sftkb;
	ASIX_WINDOW	*wnd = (ASIX_WINDOW *)tbid;
	struct tb_ctrl  *ctrlptr;
	U16	x, y, height;
	
	if( wnd == NULL || wnd->wndclass->wndclass_id != WNDCLASS_TSKBAR )
		return 0;

	ctrlptr = (struct tb_ctrl *)wnd->ctrl_str;
	if( wnd->style & TBS_TASKMENU )
		x = ctrlptr->x + 20;
	else
		x = ctrlptr->x;
	y = ctrlptr->y+1;
	height = ctrlptr->height -2;
	sftkb = CreateWindow( WNDCLASS_BUTTON, caption, WS_CHILD | BS_PEN_UP_CMD | BS_TRANSPARENT, x, y, width, height, tbid, 0, exdata );

	return sftkb;
}

⌨️ 快捷键说明

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