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 + -
显示快捷键?