📄 gui.c
字号:
else return 0;
}
void InitRect(short left,short top,short right,short bottom,PDARECT *pRc)
{
pRc->left=left;
pRc->top=top;
pRc->right=right;
pRc->bottom=bottom;
}
typedef struct _BMPHEAD
{
unsigned char mode;
unsigned char gray;
unsigned short width;
unsigned short high;
}BMPHEAD;
/*======================================================================
---在LCD中以包括图象头的图象数据s显示一幅图象----DispBmp---
======================================================================*/
void DispBmp(short x,short y,unsigned char *s)
{
BMPHEAD *pBmphead=(BMPHEAD *)s;
if(pBmphead->mode==0&&pBmphead->gray==4)DispImage(x,y,pBmphead->width,pBmphead->high,&s[sizeof(BMPHEAD)]);
}
void DispBmpGray(short x,short y,unsigned char *s)
{
BMPHEAD *pBmphead=(BMPHEAD *)s;
if(pBmphead->mode==0&&pBmphead->gray==4)DispImageGray(x,y,pBmphead->width,pBmphead->high,&s[sizeof(BMPHEAD)]);
}
unsigned char * GetFont8x16(unsigned char CharCode)
{
return RomAddress+ROM_ASCII16+(long)(CharCode*16);
}
unsigned char * GetFont16x16(unsigned short CharCode)
{
return RomAddress+ROM_HZK16+(((((CharCode&0x00ff)-0xa1)*94+((CharCode>>8)-0xa1)))*32);
}
short DispChar(short x,short y,unsigned short CharCode,unsigned char FrontColor,unsigned char BackColor)
{
short i,j;
unsigned char mask,*s;
if((CharCode>>8)&0x80)
{
if(16+x>=LCD_WIDTH)return 0;
s=GetFont16x16(CharCode);
for(j=y;j<y+16;j++)
{
mask=0x80;
for(i=0;i<8;i++)
{
DispDot(x+i,j,(*s&mask)?FrontColor:BackColor);
DispDot(x+8+i,j,(s[1]&mask)?FrontColor:BackColor);
mask=(mask>>1);
}
s+=2;
}
return 16;
}
else
{
if(8+x>=LCD_WIDTH)return 0;
s=GetFont8x16((unsigned char)CharCode);
for(j=y;j<y+16;j++)
{
mask=0x80;
for(i=0;i<8;i++)
{
DispDot(x+i,j,(*s&mask)?FrontColor:BackColor);
mask=(mask>>1);
}
s++;
}
return 8;
}
}
void DispStr(short x,short y,unsigned char *s,unsigned char FrontColor,unsigned char BackColor)
{
short i;
while(*s&&*s!='\n'&&*s!='\r')
{
if((*s)&0x80)
{
i=DispChar(x,y,*((unsigned short*)s),FrontColor,BackColor);
s+=2;
}
else
{
i=DispChar(x,y,(unsigned short)(*s),FrontColor,BackColor);
s++;
}
if(!i)break;
x+=i;
}
}
short GetStrLength(unsigned char *s)
{
short i;
if(s==NULL)return 0;
for(i=0;*s++;i++);
return i;
}
short GetStrCharNum(unsigned char *s)
{
short i;
if(s==NULL)return 0;
for(i=0;*s;i++)s+=(*s&0x80)?2:1;
return i;
}
short GetStrWidth(short Margin,unsigned char *s)
{
short w=0;
if(s==NULL)return 0;
while(*s)
{
if(*s&0x80){ w+=16; s+=2; }
else { w+=8; s++; }
w+=Margin;
}
return w;
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---CURSOR结构定义----CURSOR---
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
typedef struct _CURSOR
{
short x,y; /*LCD 象素坐标*/
short OnOff; /*OnOff=1: ON, 0: OFF*/
short ShowOrHide;/*光标是否显示在屏幕上*/
short Width,Height;/*光标的宽度和高度*/
}CURSOR;
CURSOR Cursor;
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---CURSOR function begin--------------------------------------------□
□ □
□---2000.8.4---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void ProcessCursor(void)
{
DispReverse(Cursor.x,Cursor.y,Cursor.Width,Cursor.Height);
Cursor.ShowOrHide=Cursor.ShowOrHide?0:1;
}
void SetCursorSize(short width,short height)
{
short flag=Cursor.OnOff;
if(flag)CursorOff();
Cursor.Width=width;
Cursor.Height=height;
if(flag)CursorOn();
}
void CursorOn(void)
{
if(!Cursor.OnOff)
{
Cursor.OnOff=1;
Cursor.ShowOrHide=0;
ProcessCursor();
PSDE_INT_SetTime1(500);
PSDE_SetFuncTime1(ProcessCursor);
}
}
void MoveCursor(short x,short y)
{
short flag=Cursor.OnOff;
if(flag)CursorOff();
if(x+Cursor.Width>=LCD_WIDTH)x=LCD_WIDTH-Cursor.Width-1;
if(y+Cursor.Height>=LCD_HIGH)y=LCD_HIGH-Cursor.Height-1;
Cursor.x=x;
Cursor.y=y;
if(flag)CursorOn();
}
void CursorOff(void)
{
if(Cursor.OnOff)
{
Cursor.OnOff=0;
if(Cursor.ShowOrHide)ProcessCursor();
PSDE_INT_KillTime1();
}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---CURSOR function end----------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---BUTTON function begin--------------------------------------------□
□ □
□---2000.8.8---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void InitButton(BUTTON *b,PDARECT *pRc,short style)
{
b->Rect=*pRc;
b->Style=style;
b->BackColor=COLOR_BACK;
}
void SetButtonStr(BUTTON *b,unsigned char *str,unsigned char c)
{
short l;
b->Style|=PBN_STRING;
b->Str=str;
b->StrColor=c;
l=GetStrLength(str);
b->StrX=(b->Rect.right-b->Rect.left-l*8)/2+b->Rect.left;
b->StrY=(b->Rect.bottom-b->Rect.top-16)/2+b->Rect.top;
}
void SetButtonBmp(BUTTON *b,unsigned char *pBmp1,unsigned char *pBmp2)
{
BMPHEAD *pBmphead;
b->Style|=PBN_BMP;
b->Bmp=pBmp1;
pBmphead=(BMPHEAD *)pBmp1;
b->StrX=(b->Rect.right-b->Rect.left+1-pBmphead->width)/2+b->Rect.left;
b->StrY=(b->Rect.bottom-b->Rect.top+1-pBmphead->high)/2+b->Rect.top;
if(pBmp2!=NULL)
{
b->Style|=PBN_TWOBMP;
b->Str=pBmp2;
pBmphead=(BMPHEAD *)pBmp2;
if(pBmphead->gray!=4)
{
b->BmpX=b->StrX;
b->BmpY=b->StrY-8;
SetButtonStr(b,pBmp2,COLOR_GRAY);
b->Style&=~(PBN_BMP|PBN_TWOBMP|PBN_STRING);
b->Style|=(PBN_ICON|PBN_NOFRAME);
pBmphead=(BMPHEAD *)pBmp1;
b->StrY=b->Rect.bottom-17;
}
}
}
void DrawButtonFrame(BUTTON *b,short f)
{
short w,h;
PDARECT *rc=&b->Rect;
w=rc->right-rc->left+1;
h=rc->bottom-rc->top+1;
if(f)
{
DrawLineX(rc->left,rc->bottom-1,w-1,COLOR_BACK);
DrawLineY(rc->right-1,rc->top,h-1,COLOR_BACK);
DrawLineX(rc->left,rc->bottom,w,COLOR_WHITE);
DrawLineY(rc->right,rc->top,h,COLOR_WHITE);
DrawLineX(rc->left,rc->top,w,COLOR_GRAY);
DrawLineY(rc->left,rc->top,h,COLOR_GRAY);
DrawLineX(rc->left,rc->top+1,w-1,COLOR_LOWGRAY);
DrawLineY(rc->left+1,rc->top,h-1,COLOR_LOWGRAY);
}
else
{
DrawLineX(rc->left,rc->top,w,COLOR_WHITE);
DrawLineY(rc->left,rc->top,h,COLOR_WHITE);
DrawLineX(rc->left+1,rc->top+1,w-1,COLOR_BACK);
DrawLineY(rc->left+1,rc->top+1,h-1,COLOR_BACK);
DrawLineX(rc->left+1,rc->bottom-1,w-1,COLOR_LOWGRAY);
DrawLineY(rc->right-1,rc->top+1,h-1,COLOR_LOWGRAY);
DrawLineX(rc->left,rc->bottom,w,COLOR_GRAY);
DrawLineY(rc->right,rc->top,h,COLOR_GRAY);
}
}
void DrawButton(BUTTON *b,short i)
{
short x,y,s=b->Style;
if(s&PBN_ICON)
{
if(i)
{
DispBmpGray(b->BmpX,b->BmpY,b->Bmp);
}
else DispBmp(b->BmpX,b->BmpY,b->Bmp);
DispStr(b->StrX,b->StrY,b->Str,i?COLOR_BLACK:COLOR_HIGHGRAY,i?COLOR_BACK:COLOR_WHITE);
}
else
{
DrawBar(&b->Rect,b->BackColor);
x=b->StrX;y=b->StrY;
if(i)
{
x++;
y++;
if(s&PBN_TWOBMP)DispBmp(x,y,b->Str);
}
if((s&PBN_BMP)||((s&PBN_TWOBMP)&&!i))
{
DispBmp(x,y,b->Bmp);
}
if(s&PBN_STRING)
{
DispStr(x,y,b->Str,b->StrColor,COLOR_TRANS);
}
if(!(s&PBN_NOFRAME))
{
if(s&PBN_REVERSE)DrawRect(&b->Rect,COLOR_HIGHGRAY);
else DrawButtonFrame(b,i);
}
}
}
short GetNullButton(BUTTON *b,PDAMSG *pMsg,void *func(BUTTON *b,short i))
{
char press=0;
if(!(pMsg->type==MSG_LCD&&CheckPointInRect(pMsg->x,pMsg->y,&b->Rect)))return 0;
while(pMsg->type==MSG_LCD)
{
if(pMsg->PenStatus)
{
if(CheckPointInRect(pMsg->x,pMsg->y,&b->Rect))
{
if(!press)
{
press=1;
if(func!=NULL)func(b,1);
}
}
else
{
if(press)
{
press=0;
if(func!=NULL)func(b,0);
}
}
}
else
{
pMsg->type=0;
if(press)if(func!=NULL)func(b,0);
if(CheckPointInRect(pMsg->x,pMsg->y,&b->Rect))return 1;
else return 0;
}
GetMsg(pMsg);
TranslateMsg(pMsg);
}
if(press)if(func!=NULL)func(b,0);
return 0;
}
short GetButton(BUTTON *b,PDAMSG *pMsg)
{
return GetNullButton(b,pMsg,(void *)DrawButton);
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---BUTTON function end----------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -