📄 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 + -