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

📄 guimsg.c

📁 基于NuCleus操作系统下的一个GUI界面
💻 C
📖 第 1 页 / 共 5 页
字号:
		{
			//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 + -