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

📄 tft_api.c

📁 GPRS模组资料包含DEMO
💻 C
📖 第 1 页 / 共 4 页
字号:
void TFT_PutPixelLine(WIN_HANDLE Handle, short x, short y, short len, COLOR *ColorTab)
{
	STR_WINDOW *Window = g_WinList + Handle;
	short Sx, Sy, Ex;
	short LB, RB, TB, BB;
	COLOR color;

	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	LB = Window->TLx>=0 ? Window->TLx : 0;					// Left bound
	RB = Window->BRx;										// Right bound
	TB = Window->TLy>=0 ? Window->TLy : 0;					// Top bound
	BB = Window->BRy;										// Bottom bound

	Sx = Window->TLx + x;
	Sy = Window->TLy + y;
	Ex = Window->TLx + x + len;

	if((Sy<TB) || (Sy>BB))return;							// 如果线在工作区外则直接退出
	if((Sx<LB && Ex<LB) || (Sx>RB && Ex>RB))return;

	if(Sx<LB)												// 确定实际绘画区域
	{
		ColorTab += (LB - Sx);
		Sx = LB;
	}
	if(Ex>RB) Ex = RB;
	color = TFT_GetColor(Handle);
	while(Sx != Ex)
	{
		TFT_SetColor(Handle, *ColorTab++);
		TFT_PutPixelAbsolute(Handle, Sx, Sy);
		Sx++;
	}
	TFT_SetColor(Handle, color);
}

//=============================================================
//语法格式:	void TFT_Line(STR_WINDOW *Window, short x1, short y1, short x2, short y2);
//实现功能:	在工作区中画直线
//参数:		Window - 工作窗口指针
//				x1 - 起始点的x坐标(相对于工作区)
//				y1 - 起始点的y坐标(相对于工作区)
//				x2 - 结束点的x坐标(相对于工作区)
//				y2 - 结束点的y坐标(相对于工作区)
//返回值:		无
//=============================================================
void TFT_Line(WIN_HANDLE Handle, short x1, short y1, short x2, short y2)
{
	STR_WINDOW *Window = g_WinList + Handle;
	short Sx, Sy, Ex, Ey;
	short LB, RB, TB, BB;
	short Offset_x,Offset_y,Offset_k = 0;
	short Err_d = 1;
	short W, H;

	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	TFT_GetWorkBufSize(&W, &H);
	LB = Window->TLx>=0 ? Window->TLx : 0;					// Left bound
	RB = Window->BRx;	// Right bound
	TB = Window->TLy>=0 ? Window->TLy : 0;					// Top bound
	BB = Window->BRy;	// Bottom bound

	Sx = Window->TLx + x1;
	Sy = Window->TLy + y1;
	Ex = Window->TLx + x2;
	Ey = Window->TLy + y2;

	if((Sx<LB && Ex<LB) || (Sx>RB && Ex>RB))return;			// 如果线在工作区外则直接退出
	if((Sy<TB && Ey<TB) || (Sy>BB && Ey>BB))return;

	if(Sx<LB) Sx = LB;										// 确定实际绘画区域
	if(Sx>RB) Sx = RB;
	
	if(Sy<TB) Sy = TB;
	if(Sy>BB) Sy = BB;

	if(Ex<LB) Ex = LB;
	if(Ex>RB) Ex = RB;

	if(Ey<TB) Ey = TB;
	if(Ey>BB) Ey = BB;
	
	if(Sy>Ey)
	{
		Offset_x = Sx;
		Sx = Ex;
		Ex = Offset_x;
		Offset_y = Sy;
		Sy = Ey;
		Ey = Offset_y;
	}

	Offset_x = Ex-Sx;
	Offset_y = Ey-Sy;
	TFT_PutPixelAbsolute(Handle, Sx, Sy);
	if(Offset_x<=0)
	{
		Offset_x = Sx-Ex;
		Err_d = -1;
	}
	if(Offset_x>Offset_y)
	{
		while(Sx!=Ex)
		{
			if(Offset_k>0)
			{
				Sy += 1;
				Offset_k += (Offset_y-Offset_x);
			}
			else Offset_k += Offset_y; 
			Sx += Err_d;
			TFT_PutPixelAbsolute(Handle, Sx,Sy);
		}	
	}
	else
	{
		while(Sy!=Ey)
		{
			if(Offset_k>0)
			{
				Sx += Err_d;
				Offset_k += (Offset_x-Offset_y);
			}
			else Offset_k += Offset_x;
			Sy += 1;
			TFT_PutPixelAbsolute(Handle, Sx, Sy);
		}
	}
}

//=============================================================
//语法格式:	void TFT_Circle(STR_WINDOW *Window, unsigned x,unsigned y,unsigned r,unsigned Mode);
//实现功能:	在工作区中画圆
//参数:		Window - 工作窗口指针
//				x - 圆心的x坐标(相对于工作区)
//				y - 圆心的y坐标(相对于工作区)
//				r - 圆的半径
//				Mode -	0(PAINT_HOLLOW)	空心圆
//						1(PAINT_SOLID)	实心圆
//返回值:		无
//=============================================================
void TFT_Circle(WIN_HANDLE Handle, unsigned x,unsigned y,unsigned r,unsigned Mode)
{
	STR_WINDOW *Window = g_WinList + Handle;
	int dx,dy,ref;
	int Temp;
	
	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	if(r == 0)return;
	dx = r;
	dy = 1;
	ref = 707 * r / 1000;									// 参考值为0.707r

	if(Mode == PAINT_SOLID)									// 实心圆
	{
		while(dy <= dx)
		{
			if(dx > ref)
				TFT_Line(Handle, x + ref + 1, y + dy, x + dx, y + dy);

			if(x >= ref + 1 && dx > ref)
			{
				if(x < dx)
					Temp = 0;
				else
					Temp = x - dx;
				TFT_Line(Handle, Temp, y + dy, x - ref - 1, y + dy);
			}
			
			if(y >= dy && dx > ref)
				TFT_Line(Handle, x + ref + 1, y - dy, x + dx, y - dy);
			if(x >= ref + 1 && y >= dy && dx > ref)
			{
				if(x < dx)
					Temp = 0;
				else
					Temp = x - dx;
				TFT_Line(Handle, Temp, y - dy, x - ref - 1, y - dy);
			}

			if(dy != dx || dx == ref)
			{
				if(y < dx)
					Temp = 0;
				else
					Temp = y - dx;
				TFT_Line(Handle, x + dy, Temp, x + dy, y + dx);
			}

			if(x >= dy && (dy != dx || dy == ref))
			{
				if(y < dx)
					Temp = 0;
				else
					Temp = y - dx;
				TFT_Line(Handle, x - dy, Temp, x - dy, y + dx);
			}			
			dy++;
			if((r*r-dy*dy)<=(dx-1)*dx)
				dx--;
		}

		TFT_Line(Handle, x + ref + 1, y, x + r, y);

		if(x >= ref + 1)
		{
			if(x < r)
				Temp = 0;
			else
				Temp = x - r;
			TFT_Line(Handle, Temp, y, x - ref - 1, y);
		}

		if(y < r)
			Temp = 0;
		else
			Temp = y - r;
		TFT_Line(Handle, x, Temp, x, y + r);
	}
	else													// 空心圆
	{
		while(dy <= dx)
		{
			TFT_PutPixel(Handle, x + dx, y + dy);
			TFT_PutPixel(Handle, x - dx, y + dy);
			TFT_PutPixel(Handle, x + dx, y - dy);
			TFT_PutPixel(Handle, x - dx, y - dy);
			if(dx != dy)
			{
				TFT_PutPixel(Handle, x + dy, y + dx);
				TFT_PutPixel(Handle, x + dy, y - dx);
				TFT_PutPixel(Handle, x - dy, y + dx);
				TFT_PutPixel(Handle, x - dy, y - dx);
			}
			dy++;
			if((r*r-dy*dy)<=(dx-1)*dx)
				dx--;
		}
		TFT_PutPixel(Handle, x + r, y);
		TFT_PutPixel(Handle, x - r, y);
		TFT_PutPixel(Handle, x, y + r);
		TFT_PutPixel(Handle, x, y - r);
	}	
}

//=============================================================
//语法格式:	void TFT_Rectangle(STR_WINDOW *Window, unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned Mode);
//实现功能:	在工作区中矩形
//参数:		Window - 工作窗口指针
//				x1 - 矩形的左上角x坐标(相对于工作区)
//				y1 - 矩形的左上角y坐标(相对于工作区)
//				x2 - 矩形的右下角x坐标(相对于工作区)
//				y2 - 矩形的右下角y坐标(相对于工作区)
//				Mode -	0(PAINT_HOLLOW)	空心矩形
//						1(PAINT_SOLID)	实心矩形
//返回值:		无
//=============================================================
void TFT_Rectangle(WIN_HANDLE Handle, unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned Mode)
{
	STR_WINDOW *Window = g_WinList + Handle;
	int i;
	short W, H;

	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	TFT_GetWorkBufSize(&W, &H);
	if(x1>x2)
	{
		i = x1;
		x1 = x2;
		x2 = i;
	}
	if(x2 > Window->BRx)
		x2 = Window->BRx;
	if(y1>y2)
	{
		i = y1;
		y1 = y2;
		y2 = i;
	}
	if(y2 > Window->BRy)
		y2 = Window->BRy;
	if(Mode == PAINT_SOLID)									// 实心矩形
	{
		for(i=y1; i<=y2; i++)
		{
			TFT_Line(Handle, x1, i, x2, i);
		}
	}
	else													// 空心矩形
	{
		for(i = 0; i < Mode; i++)
		{
			TFT_Line(Handle, x1 + i, y1 + i, x2 - i, y1 - i);
			TFT_Line(Handle, x1 + i, y2 + i, x2 - i, y2 - i);
			TFT_Line(Handle, x1 + i, y1 + i+1, x1 - i, y2 - i-1);
			TFT_Line(Handle, x2 + i, y1 + i+1, x2 - i, y2 - i-1);
		}
	}
}

//=============================================================
//语法格式:	void TFT_SetTextPos(STR_WINDOW *Window, short x, short y);
//实现功能:	设置工作区中的文本显示位置
//参数:		Window - 工作窗口指针
//				x - 文本的左上角x坐标(相对于工作区)
//				y - 文本的左上角y坐标(相对于工作区)
//返回值:		无
//=============================================================
void TFT_SetTextPos(WIN_HANDLE Handle, short x, short y)
{
	STR_WINDOW *Window = g_WinList + Handle;

	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	Window->CurTextX = x;
	Window->CurTextY = y;
}

//=============================================================
//语法格式:	void TFT_GetTextPos(STR_WINDOW *Window, short *x, short *y);
//实现功能:	获取工作区中即将显示的文本位置
//参数:		Window - 工作窗口指针
//				x - 文本的左上角x坐标(相对于工作区)
//				y - 文本的左上角y坐标(相对于工作区)
//返回值:		无
//=============================================================
void TFT_GetTextPos(WIN_HANDLE Handle, short *x, short *y)
{
	STR_WINDOW *Window = g_WinList + Handle;

	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	*x = Window->CurTextX;
	*y = Window->CurTextY;
}

//=============================================================
//语法格式:	void TFT_SetChineseFont(STR_WINDOW *Window, short FontType);
//实现功能:	设置当前使用的中文字库
//参数:		Window - 工作窗口指针
//				FontType - 字库序号(0~n)
//返回值:		无
//=============================================================
void TFT_SetChineseFont(WIN_HANDLE Handle, FONT FontID)
{
	STR_WINDOW *Window = g_WinList + Handle;

	if((Handle < 0) || (Handle >= MAX_WINDOW) || (Window->Flag == 0))
		return;
	Window->ChineseFont = FontID;
}

⌨️ 快捷键说明

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