📄 uibutton.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 + -