利用ANSI码对光标进行操作,对显示的字形用方框显示出来,如下图所示:

ps:本人计算机语言半吊子一个,如果有不妥之处请多多包涵与指教^^
代码部分
头文件display.h
/***********************************************************
FileName:display.h
FileFunc:控制屏幕显示信息和光标的状态头文件
Version:V0.1
Author :
Date :
Descp :实现屏幕和光标的控制
************************************************************/
#ifndef __DISPLAY_H__
#define __DISPLAY_H__
#define MAX_DISPLAY_ITEM 25 //25rows
#define MAX_DISPLAY_WIDTH 80 //80columns
void Display_Message(int x,int y,string str);
void Draw_Box(int row,int col,int len,int wid);
void Move_Cursor(int x,int y);
void Display_Cursor(void);
void Hide_Cursor(void);
void Clear_Screen(void);
#endif /*__DISPLAY_H__*/
实现文件display.c
/***********************************************************
FileName:display.c
FileFunc:控制屏幕显示信息和光标的实现文件
Version:V0.1
Author :
Date :
Descp :实现屏幕和光标的控制
************************************************************/
#include <ansi.h>
#include <display.h>
//x:从1***行***开始计算 y:从1***列***开始计算
//从x行y列开始显示信息str
void Display_Message(int x,int y,string str)
{
//sprintf("\033[%d;%dH%s",x,y,str);
printf("\033[%d;%dH%s",x,y,str);
}
//定义边框的符号,在fluffos的testsuite文件夹内的unicode相关的文件里有丰富的符号
#define TOPLEFT "┌" //左上角
#define TOPRIGHT "┐" //右上角
#define BOTLEFT "└" //左下角
#define BOTRIGHT "┘" //右下角
#define VERLINE "│"
#define HORLINE "─"
// 从row行col列开始画wid宽len长的边框
//length len width wid rangtangle
void Draw_Box(int row,int col,int len,int wid)
{
string strTop = TOPLEFT;
string strBot = BOTLEFT;
int end;
for(int i=1;i<wid-1;i++)
{
strTop += HORLINE;//top boxline
strBot += HORLINE;//bottom boxline
}
strTop += TOPRIGHT +"\0";
strBot += BOTRIGHT +"\0";
end = col + wid -1;
Display_Message(row,col,strTop);//画上边
for(int i=1;i<len;i++)
{
Display_Message(row+i,col,VERLINE);//画竖左边
Display_Message(row+i,end,VERLINE+"\0");//画竖右边
}
Display_Message(row+len-1,col,strBot);//画下边
}
//移动光标至x行y列
void Move_Cursor(int x,int y)
{
printf("\033[%d;%dH",x,y);
}
//显示光标
void Display_Cursor()
{
write("\033[?25h");
}
//清屏
void Clear_Screen()
{
write(CLR);
}
//隐藏光标
void Hidden_Cursor()
{
write("\0338m");
}
void Reset()
{
}
//此处是测试
int main(object ob,string arg)
{
switch(arg)
{
case "move_cursor":
Move_Cursor(50,50);
write("\n");
write("here\n");
break;
case "display_cursor":
Display_Cursor();
write("\n");
write("display_cursor success\n");
case "display_message":
write("\n");
Display_Message(20,20,"hello world");
break;
case "Draw_Box":
Draw_Box(19,19,3,strlen("hello world")+2);
break;
case "cls":
Clear_Screen();
break;
case "reset":
Move_Cursor(0,0);
break;
default:
write("please choose right parameters!!");
return 0;
}
return 1;
}
需要注意的
- Draw_Box的起始点应该是 字符串的显示起始点(x,y)(x-n,y-m)(边框离起始点的距离)
- 只是突然的想法写出来的,第一次发贴,可能有不足之处,见谅