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

📄 menu.c

📁 Taiwan sunplus develop spce3200, it is a test program ----- testboard source code
💻 C
字号:
//====================================================================================
//File name:	Menu.c
//Description:	Handle menu
//Update:		V1.0 by wangtao <wangtao@sunnorth.com.cn>
//====================================================================================
#include "SystemHeader.h"

short Menu_CurItemSelected;
MENU *pMenu_Cur;

//=============================================================
//Prototype:	void Menu_Display(MENU *pMenu)
//Description: 	Display menu
//Argument:		pMenu -	Menu to be displayed
//Return Value: None
//=============================================================
void Menu_Display(MENU *pMenu)
{
	unsigned short i;
	short TempX, TempY, TempR, Temp;
	unsigned short OldColor, TempColor;
	const char *p;
	STR_FONT ChineseFont, AsciiFont;
	
	TFT_SetTransparency(0);
	TFT_SetChineseFont(pMenu->ChineseFont);
	TFT_SetAsciiFont(pMenu->AsciiFont);
	
	OldColor = TFT_GetColor();
	TFT_GetChineseFont(&ChineseFont);
	TFT_GetAsciiFont(&AsciiFont);
	TempR = pMenu->ItemHeight >> 2;
	for(i = 0; i < pMenu->ItemCount; i++)
	{
		TempX = pMenu->x;
		TempY = pMenu->y + i * (pMenu->ItemHeight + pMenu->ItemSpacing);

		TempColor = (i==pMenu->ItemSelected) ? pMenu->BorderColor_Sel : pMenu->BorderColor;
//		TFT_SetColor(TempColor);
//		TFT_Circle(TempX+TempR, TempY+TempR, TempR, PAINT_HOLLOW);
//		TFT_Circle(TempX+TempR, TempY+pMenu->ItemHeight-TempR, TempR, PAINT_HOLLOW);
//		TFT_Circle(TempX+pMenu->ItemWidth-TempR, TempY+TempR, TempR, PAINT_HOLLOW);
//		TFT_Circle(TempX+pMenu->ItemWidth-TempR, TempY+pMenu->ItemHeight-TempR, TempR, PAINT_HOLLOW);

		TempColor = (i==pMenu->ItemSelected) ? pMenu->BackColor_Sel : pMenu->BackColor;
		TFT_SetColor(TempColor);
		TFT_Rectangle(TempX+TempR, TempY+1, TempX+pMenu->ItemWidth-TempR, TempY+pMenu->ItemHeight-1, PAINT_SOLID);
		TFT_Rectangle(TempX+1, TempY+TempR, TempX+TempR, TempY+pMenu->ItemHeight-TempR, PAINT_SOLID);
		TFT_Rectangle(TempX+pMenu->ItemWidth-TempR, TempY+TempR, TempX+pMenu->ItemWidth-1, TempY+pMenu->ItemHeight-TempR, PAINT_SOLID);
		TFT_Circle(TempX+TempR, TempY+TempR, TempR-1, PAINT_SOLID);
		TFT_Circle(TempX+TempR, TempY+pMenu->ItemHeight-TempR, TempR-1, PAINT_SOLID);
		TFT_Circle(TempX+pMenu->ItemWidth-TempR, TempY+TempR, TempR-1, PAINT_SOLID);
		TFT_Circle(TempX+pMenu->ItemWidth-TempR, TempY+pMenu->ItemHeight-TempR, TempR-1, PAINT_SOLID);

		TempColor = (i==pMenu->ItemSelected) ? pMenu->BorderColor_Sel : pMenu->BorderColor;
		TFT_SetColor(TempColor);
		TFT_Line(TempX+TempR, TempY, TempX+pMenu->ItemWidth-TempR, TempY);
		TFT_Line(TempX+TempR, TempY+pMenu->ItemHeight, TempX+pMenu->ItemWidth-TempR, TempY+pMenu->ItemHeight);
		TFT_Line(TempX, TempY+TempR, TempX, TempY+pMenu->ItemHeight-TempR);
		TFT_Line(TempX+pMenu->ItemWidth, TempY+TempR, TempX+pMenu->ItemWidth, TempY+pMenu->ItemHeight-TempR);

		TempColor = (i==pMenu->ItemSelected) ? pMenu->ForeColor_Sel : pMenu->ForeColor;
		TFT_SetColor(TempColor);
		TFT_SetBGColor(COLOR_BLACK);
	
		Temp = 0;
		p =	pMenu->Items[i];
		while(*p!='\0')
		{
			if(*p&0x80)
			{
				p++;
				Temp += ChineseFont.CharWidth;
			}
			else
			{
				Temp += AsciiFont.CharWidth;
			}
			p++;
		}
		
		TempX = TempX + ((pMenu->ItemWidth - Temp)>>1);
		TempY = TempY + ((pMenu->ItemHeight - ChineseFont.CharHeight)>>1);
		TFT_SetTextPos(TempX, TempY);
		TFT_Print((char*)pMenu->Items[i]);
	}
	Menu_CurItemSelected = pMenu->ItemSelected;
	pMenu_Cur = pMenu;
	TFT_SetColor(OldColor);
}

void Menu_ServiceLoop(void)
{
	if(pMenu_Cur->ItemSelected != Menu_CurItemSelected)
	{
		Menu_Display(pMenu_Cur);
	}
}

short Menu_CursorItem(short AbsX, short AbsY)
{
	short Ret, i;
	short TempX, TempY, TempX1, TempY1, TempX2, TempY2;
	
	Ret = -1;
	TFT_GetWindow(&TempX1, &TempY1, &TempX2, &TempY2);
	TempX = AbsX - TempX1;
	TempY = AbsY - TempY1;
	
	TempX1 = pMenu_Cur->x;
	TempX2 = TempX1 + pMenu_Cur->ItemWidth;

	for(i=0; i<pMenu_Cur->ItemCount; i++)
	{
		TempY1 = pMenu_Cur->y + i * (pMenu_Cur->ItemHeight + pMenu_Cur->ItemSpacing);
		TempY2 = TempY1 + pMenu_Cur->ItemHeight;
		if(TempX>=TempX1 && TempX<=TempX2 && TempY>=TempY1 && TempY<=TempY2)
		{
			Ret = i;
			break;
		}
	}
	return Ret;
 }

⌨️ 快捷键说明

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