📄 guimsg.c
字号:
{
//Dot1335(x+j,y+i,0x0,0x0,(Mask&TempChar));
iNum = (y+i)*SCR_WIDTH +x+j;
//字符部分
if(Mask&TempChar)
{
//iNum = (y+i)*SCR_WIDTH +x+j;
pScreen->framebuffer[iNum].R = pRgbFont->R;
pScreen->framebuffer[iNum].G = pRgbFont->G;
pScreen->framebuffer[iNum].B= pRgbFont->B;
}
//除掉字符的部分
else
{ //modified by zzm
//除掉字符部分画反色
if( scr1.formlink.pCurrentForm==&frmSet)
{
pScreen->framebuffer[iNum].R = ~(pRgbFont->R);
pScreen->framebuffer[iNum].G = ~(pRgbFont->G);
pScreen->framebuffer[iNum].B= ~(pRgbFont->B);
}
//除掉字符部分画白色
else
{
//pScreen->framebuffer[iNum] = rgbWhite;
pScreen->framebuffer[iNum].R = 0xff;
pScreen->framebuffer[iNum].G = 0xff;
pScreen->framebuffer[iNum].B= 0xff;
}
}
Mask>>=1;
}
}
}*/
//to display text in a window
//GBK standard
//ascii char:
//tab : 0x09
//return : 0x0d
//在一个窗口内显示字符
char *TextWindowOut(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint LeftTopX,uint LeftTopY, uint BottomRightX,uint BottomRightY, char *RawText, uint iReverseNo)
{
unsigned char Next0,Next1,tempchar;
unsigned int x,y;
RGB rgbTemp;
GUI_WINCONTROL* pWControl;
char* pText;
x=LeftTopX;
y=LeftTopY;
pText = RawText;
while(0x00!=(*RawText))
{
Next0=*RawText;
if(0x0d==Next0)
{
RawText++;
}
else if(0x09==Next0)
{
x+=fontsize;
RawText++;
if((x+fontsize)>=BottomRightX) //we should start a new line
{
y+=fontsize;
x=LeftTopX;
}
if((y+fontsize)>=BottomRightY) //this window full
return RawText;
}
else if(0x0a==Next0)
{
//if(0x20==(*(RawText+1)))
{
y+=fontsize;
x=LeftTopX;
}
RawText++;
if((x+fontsize)>=BottomRightX) //we should start a new line
{
y+=fontsize;
x=LeftTopX;
}
if((y+fontsize)>=BottomRightY) //this window full
return RawText;
}
//绘制汉字字符
else if(Next0>=0x81)
{
Next0=*RawText;
Next1=*(RawText+1);
//WriteChinese(x,y,Next0,Next1);
if((iReverseNo&&(iReverseNo == (RawText - pText+1))) || (iReverseNo == ALLREVERSE))
{
//FillRect(pScreen, x, y, fontsize, fontsize,& (pWControl->fontcolor));
rgbTemp.R = ~(pRgbFont->R);
rgbTemp.G = ~(pRgbFont->G);
rgbTemp.B = ~(pRgbFont->B);
//WriteAsci(pScreen,&rgbTemp,fontsize, x,y,Next0);
WriteChinese_set(pScreen,&rgbTemp,fontsize, x,y,Next0,Next1);
}
else
WriteChinese(pScreen,pRgbFont,fontsize, x, y, Next0, Next1);
RawText+=2;
x+=fontsize;
if((x+fontsize)>=BottomRightX) //we should start a new line
{
y+=fontsize;
x=LeftTopX;
}
if((y+fontsize)>=BottomRightY)
return RawText;
}
else if(Next0==0x00)
{
return 0x00;
}
//绘制Asci码字符
else
{
Next0=*RawText;
if((iReverseNo&&(iReverseNo == (RawText - pText+1))) || (iReverseNo == ALLREVERSE))
{
//FillRect(pScreen, x, y, fontsize, fontsize,& (pWControl->fontcolor));
rgbTemp.R = ~(pRgbFont->R);
rgbTemp.G = ~(pRgbFont->G);
rgbTemp.B = ~(pRgbFont->B);
//WriteAsci(pScreen,&rgbTemp,fontsize, x,y,Next0);
WriteAsci_set(pScreen,&rgbTemp,fontsize, x,y,Next0);
}
else
WriteAsci(pScreen,pRgbFont,fontsize, x,y,Next0);
RawText+=1;
x+=fontsize/2;
if((x+(fontsize/2))>=BottomRightX) //we should start a new line
{
y+=fontsize;
x=LeftTopX;
}
if((y+fontsize)>=BottomRightY)
return RawText;
}
}
}
int DrawText(SCR* pScreen,uint iTextMode,RGB* pRgbFont,uint fontsize,uint LeftTopX,uint LeftTopY, uint BottomRightX,uint BottomRightY, char *pRawText ,uint iReverseNo)
{
int iStrWidth,iTextCenter_X,iTextCenter_Y;
if((pScreen!=NULL)&&(pRgbFont!=NULL)&&(pRawText!=NULL))
{
switch(iTextMode)
{
case GT_LEFT:
TextWindowOut(pScreen, pRgbFont, fontsize, LeftTopX, LeftTopY, BottomRightX, BottomRightY, pRawText,iReverseNo);
break;
case GT_CENTER:
//计算字符串所占的位置长度,
//按照每个字节 占fontsize/2 宽算。
iStrWidth = (strlen(pRawText)) * fontsize/2;
//iStrWidth = strlen(pRawText) ;
//如果文本显示长度大于给定长度,
//也按照居左对齐显示
if(iStrWidth>(BottomRightX-LeftTopX))
{
TextWindowOut(pScreen, pRgbFont, fontsize, LeftTopX, LeftTopY, BottomRightX, BottomRightY, pRawText,iReverseNo);
}
else
{
iTextCenter_X = (BottomRightX + LeftTopX - iStrWidth)/2;
iTextCenter_Y = (BottomRightY + LeftTopY - fontsize)/2;
TextWindowOut(pScreen, pRgbFont, fontsize, iTextCenter_X, iTextCenter_Y, BottomRightX, BottomRightY, pRawText,iReverseNo);
}
break;
default:
TextWindowOut(pScreen, pRgbFont, fontsize, LeftTopX, LeftTopY, BottomRightX, BottomRightY, pRawText,iReverseNo);
}
}
else
return ERR_POINTER_EMPTY;
return GUI_SUCCESS;
}
void PreProcessMsg(SCR* pScr,GUI_MSG* pMsg)
{
GUI_FORM* pForm;
if(bMessage&&(gfMessageBox.pScreen == pScr))
{
switch(pMsg->msgtype)
{
case GMSG_KEY_F1:
pMsg->msgtype = GMSG_DISCARD_KEY_F1;
break;
case GMSG_KEY_F2:
pMsg->msgtype = GMSG_DISCARD_KEY_F2;
FormSwitchToNextFocus(&gfMessageBox);
break;
case GMSG_KEY_F3:
pMsg->msgtype = GMSG_DISCARD_KEY_F3;
FormSwitchToPrevFocus(&gfMessageBox);
break;
case GMSG_KEY_F4:
pMsg->msgtype = GMSG_DISCARD_KEY_F4;
break;
case GMSG_KEY_F5:
pMsg->msgtype = GMSG_DISCARD_KEY_F5;
break;
//KEY_F6为确认按钮
case GMSG_KEY_F6:
pMsg->msgtype = GMSG_DISCARD_KEY_F6;
if(gfMessageBox.pFocusChild == &gwMB_OK)
mbResult = MB_OK;
if(gfMessageBox.pFocusChild == &gwMB_CANCEL)
mbResult = MB_CANCEL;
bMessage = FALSE;
gfMessageBox.visibled = FALSE;
pForm = GetCurrentForm(pScr);
FormShow(pForm);
break;
case GMSG_KEY_F7:
pMsg->msgtype = GMSG_DISCARD_KEY_F7;
break;
default:
break;
}
}
}
//o--------->x 0-319
//|
//|
//|
//y 0-239
////////////////////////////////////////////////////////////////////////
//真的物理函数,用于画图
void Draw1335_1(const SCR* pScr,uint x, uint y,uint iWidth, uint iHeight)
{
int Row,Col;
for(Row = y; Row<y + iHeight; Row++)
{
*LcdBaseAddReg =LOADLENGTHREG(Row*SCR_WIDTH + x);
for(Col = x; Col< x+iWidth; Col++)
{
*LcdDataReg = (pScr ->framebuffer[Row*SCR_WIDTH +Col].R<<11)|( pScr ->framebuffer[Row*SCR_WIDTH +Col].G<<5)|(pScr ->framebuffer[Row*SCR_WIDTH +Col].B);
}
}
}
//////////////////////////////////////////////////////////////////////////
//移动GWC_INT_EDIT或者GWC_FLOAT_EDIT控件的光标,直接跳过'.'
//个人认为存在bug,应该加上Form控件,判断pControl是否是current,如果不是
//则程序不运行
void MoveEditCursor(GUI_WINCONTROL* pControl)
{
//如果是GWC_INT_EDIT 则tag = (tag+1)%strlen(pControl->text) drawedit
// 如果是GWC_FLOAT_EDIT 则tag = (tag+1)% strlen (pControl->text)
//如果 pControl->text[tag-1]= = '.' 那么 tag = (tag)% strlen (pControl->text)+1
//drawedit
if(pControl)
{
if((GWC_INT_EDIT== pControl->type)||(GWC_FLOAT_EDIT== pControl->type))
{
pControl->tag = (pControl->tag+1)%strlen(pControl->text);
if('.' == pControl->text[pControl->tag])
{
pControl->tag = (pControl->tag+1)%strlen(pControl->text);
}
WinControlShow(pControl);
}
}
}
/*modified by zl*/
void MoveEditCursorExam(GUI_FORM* pForm,GUI_WINCONTROL* pControl)
{
//如果是GWC_INT_EDIT 则tag = (tag+1)%strlen(pControl->text) drawedit
// 如果是GWC_FLOAT_EDIT 则tag = (tag+1)% strlen (pControl->text)
//如果 pControl->text[tag-1]= = '.' 那么 tag = (tag)% strlen (pControl->text)+1
//drawedit
if(pControl == pForm->pFocusChild)
{
if(pControl)
{
if((GWC_INT_EDIT== pControl->type)||(GWC_FLOAT_EDIT== pControl->type))
{
pControl->tag = (pControl->tag+1)%strlen(pControl->text);
if('.' == pControl->text[pControl->tag])
{
pControl->tag = (pControl->tag+1)%strlen(pControl->text);
}
WinControlShow(pControl);
}
}
}
}
//增加当前光标所在位置的数字的值
//个人认为存在bug,应该加上Form控件,判断pControl是否是current,如果不是
//则程序不运行
int IncreaseEditValue(GUI_WINCONTROL* pControl)
{
// 如果是 GWC_INT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30+1)%10+0x30,重画,然后将pControl->text的值转换为整型返回
// 如果是 GWC_FLOAT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30+1)%10+0x30,重画,然后将pControl->text的值
//转换为浮点型×1000 后的值 ,再转换为整型后返回
double dValue;
if(pControl)
{
if(GWC_INT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 47)%10 + 0x30;
WinControlShow(pControl);
return atoi(pControl->text);
}
if(GWC_FLOAT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 47)%10 + 0x30;
dValue = atof(pControl->text);
WinControlShow(pControl);
return (int)(dValue*1000);
}
if(GWC_TEXT == pControl->type)
{
strcpy(pControl->text, pControl->pcValues[pControl->valuecount]);
WinControlShow(pControl);
return 0;
}
}
return ERR_POINTER_EMPTY;
}
/*modified by zl*/
int IncreaseEditValueExam(GUI_FORM* pForm,GUI_WINCONTROL* pControl)
{
// 如果是 GWC_INT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30+1)%10+0x30,重画,然后将pControl->text的值转换为整型返回
// 如果是 GWC_FLOAT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30+1)%10+0x30,重画,然后将pControl->text的值
//转换为浮点型×1000 后的值 ,再转换为整型后返回
double dValue;
if(pControl == pForm->pFocusChild)
{
if(pControl)
{
if(GWC_INT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 47)%10 + 0x30;
WinControlShow(pControl);
return atoi(pControl->text);
}
if(GWC_FLOAT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 47)%10 + 0x30;
dValue = atof(pControl->text);
WinControlShow(pControl);
return (int)(dValue*1000);
}
if(GWC_TEXT == pControl->type)
{
strcpy(pControl->text, pControl->pcValues[pControl->valuecount]);
WinControlShow(pControl);
return 0;
}
}
}
return ERR_POINTER_EMPTY;
}
//减小当前光标所在位置的数字的值
//个人认为存在bug,应该加上Form控件,判断pControl是否是current,如果不是
//则程序不运行
int DecreaseEditValue(GUI_WINCONTROL* pControl)
{
// 如果是 GWC_INT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30- 1)%10+0x30,重画,然后将pControl->text的值转换为整型返回
// 如果是 GWC_FLOAT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30- 1)%10+0x30,重画,然后将pControl->text的值
//转换为浮点型×1000 后的值 ,再转换为整型后返回
float dValue;
if(pControl)
{
if(GWC_INT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 9)%10 + 0x30;
WinControlShow(pControl);
return atoi(pControl->text);
}
if(GWC_FLOAT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 9)%10 + 0x30;
dValue = atof(pControl->text);
WinControlShow(pControl);
return (int)(dValue*1000);
}
if(GWC_TEXT == pControl->type)
{
strcpy(pControl->text, pControl->pcValues[pControl->valuecount]);
WinControlShow(pControl);
return 0;
}
}
return ERR_POINTER_EMPTY;
}
/*modified by zl*/
int DecreaseEditValueExam(GUI_FORM* pForm,GUI_WINCONTROL* pControl)
{
// 如果是 GWC_INT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30- 1)%10+0x30,重画,然后将pControl->text的值转换为整型返回
// 如果是 GWC_FLOAT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30- 1)%10+0x30,重画,然后将pControl->text的值
//转换为浮点型×1000 后的值 ,再转换为整型后返回
float dValue;
if(pControl == pForm->pFocusChild)
{
if(pControl)
{
if(GWC_INT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 9)%10 + 0x30;
WinControlShow(pControl);
return atoi(pControl->text);
}
if(GWC_FLOAT_EDIT== pControl->type)
{
pControl->text[pControl->tag] = (pControl->text[pControl->tag] - 9)%10 + 0x30;
dValue = atof(pControl->text);
WinControlShow(pControl);
return (int)(dValue*1000);
}
if(GWC_TEXT == pControl->type)
{
strcpy(pControl->text, pControl->pcValues[pControl->valuecount]);
WinControlShow(pControl);
return 0;
}
}
}
return ERR_POINTER_EMPTY;
}
int IncreaseEditValueWithoutUpdate(GUI_WINCONTROL* pControl)
{
// 如果是 GWC_INT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30+1)%10+0x30,重画,然后将pControl->text的值转换为整型返回
// 如果是 GWC_FLOAT_EDIT 则将tag所在数字取出来
//(字符值 - 0x30+1)%10+0x30,重画,然后将
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -