📄 tft_api.c
字号:
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 + -