我正在构建一个嵌入式文本编辑器,它由键盘、液晶显示器和PIC32微控制器组成,将在C中编程。例如,应用程序应该看起来像GNU nano编辑器。显示大小为40x16字符。
目前,我想知道什么才是从显示器中提取出来的好方法。我们可以将一个简单的终端概念化如下:
typedef struct {
char* content; // Current and past content
void (*update)(Terminal); // Update function
} Terminal;
void append(Terminal, char*); // Append to content & execute update function
void discard(Terminal, int); // Discard last n characters & execute update f.通过向Terminal类型添加一个函数指针,我们基本上有一个模型和一个视图。Terminal可以由append()和discard()函数控制。利用这个Terminal,我们可以用stdin和stdout制作一个简单的终端。
但是,对于nano-like编辑器来说,这还不够,它可以在屏幕上的任何地方插入和删除文本,而不仅仅是在当前数据的末尾。
我现在组成了以下类型:
typedef struct {
unsigned short rows, columns, // Screen size
first_visible_row, first_visible_column, // Left-top coordinates
cursor_x, cursor_y; // Cursor coordinates
char* content; // Current and off-screen content
void (*update)(Screen); // Update function
} Screen;这个Screen也保存屏幕外的内容,它的可见部分由它的左上方坐标决定。这使得滚动更容易。但是,在某个位置写入此屏幕的函数将是复杂的,因为content中的位置与实际显示上的坐标之间没有直接关系。
对于屏幕上的不同行,使用类型更容易的方法是保存一个rows char数组数组。然后,content将是char数组的数组,即char** content。
基本上,我是在问我建议的方法是否有问题,以及是否有更简单的方法。
总之,下面是屏幕的一些要求:
发布于 2015-09-29 01:16:32
您可能会从双缓冲区概念中获益,在这个概念中,您将比显示更长的行存储到一个更大的结构中,并在40 * 16数组中放大,该数组可以与显示事件一起向上或向下移动。为行和结束的每个开始提供偏移指针是确定的,因此箭头在更大的区域周围移动。限制移动到最小最大值。然后切和粘贴是逐行段复制。多行区域复制将是最难跟踪的,您可以限制在窗口开始。
缓冲区进出文件是一次写入操作的结束。
显示是每个字符串操作的自定义。
发布于 2015-09-05 04:32:15
将内容表示为char*是个好主意,因为这就是它的概念。
char**作为一个内容模型是不好的,因为它与固定的屏幕大小和行长相关联。因此,作为屏幕的“视图模型”,这才是有意义的。
至于光标坐标与内容数组中的位置之间的关系,我看到两个选项应该都工作得很好:
https://softwareengineering.stackexchange.com/questions/294071
复制相似问题