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

📄 uibutton.c

📁 嵌入工linux开发的源码
💻 C
字号:
/*********************************************************************/
//	文 件 名:	uiButton.cpp
//	程序说明:	Button控件
//	程序设计:	党德华
//				2001.10.19		设计完成		说明文档:R004-S209-0001
//	程序审查:	宋军霞
//				2002.01.22		审查完成		说明文档:R004-S209-0001
//	项目编号:	R004-S209
//	版	  本:	V1.0
//	版    权:	Reality Plus Technology (ShenZhen) Co.,Ltd.
/*********************************************************************/
#include <uiGui_Cfg.h>
#include <uiWnd.h>
#include <uiSound.h>

//extern struct TWindow*   gpTopWindow ;	//在uiWnd中定义

#define BUTTON_ALIGN	0x0003

//内部函数原型
static STATUS _guiButton_Delete( HNDL handle );
static STATUS _guiButton_Show( HNDL handle );
static void _guiButton_Paint(HNDL handle,WORD dispmode);
static void _guiButton_Action(HNDL handle , WORD Pen_Message, WORD x , WORD y);

static void _guiButton_Paint(HNDL handle,WORD dispmode)
{
	struct	tagGuiButton *pControl;
	WORD	left,top,right,bottom;
	int		Font_Height,Str_Width;
	int		Dis_Ypos,Dis_Xpos;
	short	Back_Color,Font_Color;
	WORD	Style;
	WORD	offset;

	pControl = (struct tagGuiButton *)handle;
	left=0;
	top=0;
	right=pControl->base.right-pControl->base.left;
	bottom=pControl->base.bottom-pControl->base.top;
	
	if(dispmode)
	{										//反显
		Back_Color = BUTTON_INVERT_BACK;
		Font_Color = BUTTON_INVERT_FONT;
	}
	else
	{										//正显
		Back_Color = BUTTON_NORMAL_BACK;
		Font_Color = BUTTON_NORMAL_FONT;
	}
	Style=pControl->base.style;
	
	offset = 2;		//文字与左右边线的相对距离

	if( (Style & BUTTON_TOP_CLOSE) || (Style & BUTTON_TOP_OPEN) )
	{
		guiDrawLine(handle,left,bottom,right,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,left,top,left,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,right,top,right,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiClearBlock(handle,left+1,top+1,right-1,bottom-1,Back_Color,0);
		if(Style & BUTTON_TOP_OPEN)
			guiDrawLine(handle,left,top,right,top,Back_Color,GUI_SOLID);
		else
			guiDrawLine(handle,left,top,right,top,BUTTON_BORDER_COLOR,GUI_SOLID);
	}
	else if( (Style & BUTTON_BOTTOM_CLOSE) || (Style & BUTTON_BOTTOM_OPEN) )
	{
		guiDrawLine(handle,left,top,right,top,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,left,top,left,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,right,top,right,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiClearBlock(handle,left+1,top+1,right-1,bottom-1,Back_Color,REPLACE_STYLE);
		if(Style & BUTTON_BOTTOM_OPEN)
			guiDrawLine(handle,left,bottom,right,bottom,Back_Color,GUI_SOLID);
		else
			guiDrawLine(handle,left,bottom,right,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
	}
	else if( (Style & BUTTON_TITLE) ) //标题条上的BUTTON
	{
		if(dispmode)
		{
			guiClearBlock(handle,left+3,top+1,right-3,bottom-1,GUI_BLACK,0);
			guiDrawLine(handle,left+2,top+2,left+2,bottom-2,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,right-2,top+2,right-2,bottom-2,GUI_BLACK,GUI_SOLID);
		}
		else
		{
			guiClearBlock(handle,left,top,right,bottom,GUI_WHITE,0);
			guiDrawPixel(handle,left,top,GUI_BLACK);
			guiDrawPixel(handle,left,bottom,GUI_BLACK);
			guiDrawPixel(handle,right,top,GUI_BLACK);
			guiDrawPixel(handle,right,bottom,GUI_BLACK);

			guiDrawLine(handle,left+3,top,right-3,top,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,left+3,bottom,right-3,bottom,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,left+1,top+2,left+1,bottom-2,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,right-1,top+2,right-1,bottom-2,GUI_BLACK,GUI_SOLID);

			guiDrawPixel(handle,left+2,top+1,GUI_BLACK);
			guiDrawPixel(handle,left+2,bottom-1,GUI_BLACK);
			guiDrawPixel(handle,right-2,top+1,GUI_BLACK);
			guiDrawPixel(handle,right-2,bottom-1,GUI_BLACK);
		}
		offset = 3;
	}
	else if( (Style & BUTTON_WIN3D) && GUI_3D)
	{
		if(dispmode)
		{							//反显
			guiDrawLine(handle,left,top,right,top,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,left,top,left,bottom,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,left,bottom,right,bottom,GUI_WHITE,GUI_SOLID);
			guiDrawLine(handle,right,top,right,bottom,GUI_WHITE,GUI_SOLID);
		}
		else
		{							//正显
			guiDrawLine(handle,left,top,right,top,GUI_WHITE,GUI_SOLID);
			guiDrawLine(handle,left,top,left,bottom,GUI_WHITE,GUI_SOLID);
			guiDrawLine(handle,left,bottom,right,bottom,GUI_BLACK,GUI_SOLID);
			guiDrawLine(handle,right,top,right,bottom,GUI_BLACK,GUI_SOLID);
		}
		guiClearBlock(handle,1,1,right-1,bottom-1,GUI_LIGHTGRAY,0);
		Font_Color=GUI_BLACK;
	}
	else if( Style & BUTTON_BORDER_HATCH)
	{
		guiDrawRect(handle,left, top, right, bottom,BUTTON_BORDER_COLOR, GUI_HATCH);
		guiClearBlock(handle,left+1,top+1,right-1,bottom-1,Back_Color,0);
	}
	else if( Style & BUTTON_BORDER_SOLID )
	{
		guiDrawRect(handle,left, top, right, bottom,BUTTON_BORDER_COLOR, GUI_SOLID);
		guiClearBlock(handle,left+1,top+1,right-1,bottom-1,Back_Color,0);
	}
	else if( Style & BUTTON_BORDER_NONE)
	{
		guiClearBlock(handle,left,top,right,bottom,Back_Color,0);
		offset = 0;		//无边框时,在左或右对齐方式时,文字与边界之间距离为0
	}
	else
	{
		//start:清背景
		guiClearBlock(handle,left+5,top+1,right-5,bottom-1,Back_Color,0);
		guiDrawLine(handle,left+4,top+2,left+4,bottom-2,Back_Color,GUI_SOLID);
		guiDrawLine(handle,left+3,top+2,left+3,bottom-2,Back_Color,GUI_SOLID);	
		guiDrawLine(handle,left+2,top+3,left+2,bottom-3,Back_Color,GUI_SOLID);	
		guiDrawLine(handle,left+1,top+5,left+1,bottom-5,Back_Color,GUI_SOLID);	
		
		guiDrawLine(handle,right-4,top+2,right-4,bottom-2,Back_Color,GUI_SOLID);	
		guiDrawLine(handle,right-3,top+2,right-3,bottom-2,Back_Color,GUI_SOLID);	
		guiDrawLine(handle,right-2,top+3,right-2,bottom-3,Back_Color,GUI_SOLID);	
		guiDrawLine(handle,right-1,top+5,right-1,bottom-5,Back_Color,GUI_SOLID);	
		//end
		
		//画边框
		guiDrawLine(handle,left+5,top,right-5,top,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,left+5,bottom,right-5,bottom,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,left,top+5,left,bottom-5,BUTTON_BORDER_COLOR,GUI_SOLID);
		guiDrawLine(handle,right,top+5,right,bottom-5,BUTTON_BORDER_COLOR,GUI_SOLID);
		
		//左上角
		guiDrawPixel(handle,left+3,top+1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+4,top+1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+2,top+2,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+1,top+3,BUTTON_BORDER_COLOR);	
		guiDrawPixel(handle,left+1,top+4,BUTTON_BORDER_COLOR);
		
		//右上角
		guiDrawPixel(handle,right-4,top+1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-3,top+1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-2,top+2,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-1,top+3,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-1,top+4,BUTTON_BORDER_COLOR);
		
		//左下角		
		guiDrawPixel(handle,left+3,bottom-1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+4,bottom-1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+2,bottom-2,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+1,bottom-4,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,left+1,bottom-3,BUTTON_BORDER_COLOR);
		
		//右下角
		guiDrawPixel(handle,right-4,bottom-1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-3,bottom-1,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-2,bottom-2,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-1,bottom-4,BUTTON_BORDER_COLOR);
		guiDrawPixel(handle,right-1,bottom-3,BUTTON_BORDER_COLOR);

		offset = 5;	//在左或右对齐方式时,文字与边界之间距离为5
	}
	
	guiPushFont(pControl->base.font) ;
	Font_Height=guiGetCharHeight();
	Dis_Ypos=getAlignCenter(1,bottom-1,Font_Height);

	Str_Width=guiGetStringWidth((char *)pControl->caption);
	if( (Style & BUTTON_ALIGN) == BUTTON_ALIGN_LEFT )
		Dis_Xpos=offset;
	else if( (Style & BUTTON_ALIGN) == BUTTON_ALIGN_RIGHT )
		Dis_Xpos=getAlignRight(offset,right-offset,Str_Width);
	else
		Dis_Xpos=getAlignCenter(offset,right-offset,Str_Width);
	guiShowString(handle,(char *)pControl->caption, Dis_Xpos,Dis_Ypos,Font_Color,FONT_TRANSPARENT);
	guiPopFont(); 
}

static void _guiButton_Action(HNDL handle , WORD Pen_Message, WORD x , WORD y)
{
	struct tagGuiControl *pControl;
	struct tagGuiMessage message; 

	pControl=(struct tagGuiControl *)handle; 
	if(pControl->checkFlag != GUI_CONTROL_CHECK_FLAG)
		return;

	if( pControl->status & CONTROL_NOT_ACTIVE)
		return;

	if(Pen_Message == PENUP)
	{
		_guiButton_Paint(handle,BUTTON_NORMAL);
		message.handle = handle;
		message.messageType=BUTTON_CLICK;
		message.x=x;
		message.y=y;
		guiEnqueue(gpTopWindow->messageQueue,&message);
		guiPenSound();
	}
	else if(Pen_Message == PENDOWN)
		_guiButton_Paint(handle,BUTTON_INVERT);
	else if(Pen_Message == PENREMOVE)
		_guiButton_Paint(handle,BUTTON_NORMAL);
	else if(Pen_Message == PENREENTER)
		_guiButton_Paint(handle,BUTTON_INVERT);
}

/*********************************************************************/
//para: left,top,right,bottom:refer to window or vport
//dest: create button
//return:
//	fail:	NULL
//	sucess: button handle
/*********************************************************************/
DLL_EXP(HNDL) guiButton_Create( WORD left, WORD top,WORD right, WORD bottom,const char* caption, WORD style)
{
	struct tagGuiButton  *pControl;

	guiEnterWCS();
	pControl=(struct tagGuiButton *)kernelMalloc(sizeof(struct tagGuiButton));
	if(pControl == NULL)
	{
		guiExitWCS();
		return NULL;
	}
	pControl->base.handle =(HNDL)pControl;	//handle is the pointer which point to this structure,identify the control
	pControl->base.type = CONTROL_BUTTON;	    //indicate the type of the control.
	pControl->base.left = left;
	pControl->base.top = top;
	pControl->base.right = right;
	pControl->base.bottom = bottom;
	pControl->base.checkFlag = GUI_CONTROL_CHECK_FLAG;	    //9296 this field would be a special value, it's able to check,the handle available or not
	pControl->base.style =  style;
	pControl->base.status = 0;			        //ACTIVE and VISIBLE
	pControl->base.font  =  GUI_DEFAULT_FONT;
	pControl->base.vportHandle = NULL;
	pControl->base.container = NULL;

	pControl->base.actionFun =(PF_ACTION )_guiButton_Action;
	pControl->base.showFun =(PF_SHOW)_guiButton_Show;		//Button_Show;
	pControl->base.delFun =(PF_DELETE)_guiButton_Delete;	//Button_Delete;

	if(caption == NULL)
		pControl->caption[0]='\0';
	else
	{
		strncpy(pControl->caption,caption,GUI_BUTTON_CAPTION_SIZE);
		pControl->caption[GUI_BUTTON_CAPTION_SIZE]='\0';
	}

	guiExitWCS();
	return (HNDL)pControl;
}

/*********************************************************************/
//para: button handle
//dest: delete button
//return:
//	fail:	STATUS_ERR
//	sucess: STATUS_OK
/*********************************************************************/
static STATUS _guiButton_Delete( HNDL handle )
{
	struct tagGuiControl *pControl;

	guiEnterWCS();
	if(handle == NULL)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	pControl=(struct tagGuiControl *)handle;
	if(pControl->checkFlag != GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	pControl->checkFlag=0;
	kernelFree((struct tagGuiButton *)handle);
	
	guiExitWCS();
	return STATUS_OK;
}

/*********************************************************************/
//para: button handle
//dest: show button
//return:
//	fail:	STATUS_ERR
//	sucess: STATUS_OK
/*********************************************************************/
static STATUS _guiButton_Show( HNDL handle )
{
	struct tagGuiControl *pControl;

	if(handle == NULL)
		return STATUS_ERR;

	guiEnterWCS();
	if(guiControl_IsVisible(handle) == FALSE)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	pControl=(struct tagGuiControl *)handle;
	if(pControl->checkFlag != GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	_guiButton_Paint(handle,BUTTON_NORMAL);
	guiExitWCS();
	return STATUS_OK;
}

/*********************************************************************/
//para: button handle  & button caption
//dest: set button caption
//return:
//	fail:	STATUS_ERR
//	sucess: STATUS_OK
/*********************************************************************/
DLL_EXP(STATUS) guiButton_SetCaption ( HNDL handle, const char *caption )
{
	struct tagGuiButton  *pControl;

	guiEnterWCS();
	if(handle == NULL)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	pControl=(struct tagGuiButton *)handle;
	if(pControl->base.checkFlag != GUI_CONTROL_CHECK_FLAG)
	{
		guiExitWCS();
		return STATUS_ERR;
	}

	if(caption == NULL)
		pControl->caption[0]='\0';
	else
	{
		strncpy(pControl->caption,(char *)caption,GUI_BUTTON_CAPTION_SIZE);
		pControl->caption[GUI_BUTTON_CAPTION_SIZE]='\0';
	}
	_guiButton_Show(handle);
    guiExitWCS();
	return STATUS_OK;
}

/*********************************************************************/
//para: button handle
//dest: get button caption
//return:
//fail: NULL
//sucess: caption string's pointer
/*********************************************************************/
DLL_EXP(char *)guiButton_GetCaption( HNDL handle )
{
	struct tagGuiButton  *pControl;

	if(handle == NULL)
		return NULL;

	pControl=(struct tagGuiButton *)handle;
	if(pControl->base.checkFlag != GUI_CONTROL_CHECK_FLAG)
		return NULL;

	return pControl->caption;
}

⌨️ 快捷键说明

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