Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 自定义GUI-可滚动文本视图_C_User Interface_Embedded - Fatal编程技术网

C 自定义GUI-可滚动文本视图

C 自定义GUI-可滚动文本视图,c,user-interface,embedded,C,User Interface,Embedded,我正在创建一个运行在STM32F429微控制器上的GUI,它是用C编写的 我遇到的问题是如何管理文本视图的滚动。我有一个带有ASCII字符的数据缓冲区,我想管理换行符(\n,ASCII代码10),以便它在文本框中给出一个新行 下面是一个小的缓冲区示例,当向后滚动一行时,不向前滚动一行:。绿色框是开始指针,红色框是结束指针。蓝色框显示一行文本(最多6个字符) 向前滚动一行: 这个很容易 将开始指针移动到下一个“\n”字符或6个位置之后(无论最先出现的是什么) 将结束指针移动到下一个“\n”字符或

我正在创建一个运行在STM32F429微控制器上的GUI,它是用C编写的

我遇到的问题是如何管理文本视图的滚动。我有一个带有ASCII字符的数据缓冲区,我想管理换行符(\n,ASCII代码10),以便它在文本框中给出一个新行

下面是一个小的缓冲区示例,当向后滚动一行时,不向前滚动一行:。绿色框是开始指针,红色框是结束指针。蓝色框显示一行文本(最多6个字符)

向前滚动一行:

这个很容易

  • 将开始指针移动到下一个“\n”字符或6个位置之后(无论最先出现的是什么)
  • 将结束指针移动到下一个“\n”字符或6个位置(无论先到什么位置)
向后滚动一行:

这就是我遇到麻烦的那个

  • 如果我们在向后移动起始指针时没有遇到换行符,我们可以将其移动6个位置而不会出现问题
  • 如果当前结束指针不是换行符“\n”,我们可以将其向后移动6个位置,但如果是,我们会遇到麻烦
通过查看表格,很容易看出开始指针需要移动2步,结束指针需要移动5步,我认为这是因为我们可以看到所有数据(即我们知道过去和未来)。但这是否意味着我们必须通过所有以前的数据才能知道行的位置

如果有人对如何解决这个问题有任何想法,我将非常感谢

编辑:
添加了另一个示例图像:

我认为没有必要回顾所有数据。您最多需要返回两个'\n'字符

要将开始指针移动到上一行的开头,请执行以下操作:

  • 如果上一个字符为“\n”,则返回一个字符。(如果上一个字符不是'\n',则继续执行步骤2。)
  • 在循环中,一次后退一个字符,直到到达另一个“\n”或文本开头。记下在此循环中向后移动的字符数
  • 最后,当上一个循环的计数大于一行字符数时,向前移动一行字符数(并将计数减少一行字符数)。继续推进行,直到计数为一行或更少。最后是上一行的开始

  • 谢谢,第一步帮助很大!我使用另一个示例buffer()进行了测试,它似乎可以工作。最坏的情况是从5号线移动到4号线,因为它需要一直移动到起点。第2步的一个小优化:“如果在一行字符后没有遇到任何“\n”(包括第1步),则可以在达到目标后停止循环。”在新示例中,这可以从第3行移动到第2行。