2015-05-22 65 views
1

我创建一个GUI来在STM32F429微控制器上运行,它是用C写自定义GUI - 滚动文本查看

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

下面是一个小例子,当滚动回滚一行时,不滚动并向前滚动一行:http://i.stack.imgur.com/4eK7w.png。绿框是开始指针,红框是结束指针。蓝色框显示一行文字(最多6个字符)。

向前滚动一行:

这个人是很容易的。

  • 将开始指针移动到下一个“\ n”char或6个位置(不管先到哪里)之后。
  • 将结束指针移动到下一个“\ n”字符或6个位置(不管先来)。

向后滚动一行:

这是我遇到的麻烦之一。

  • 如果我们在移动开始指针时没有遇到换行符,我们可以将它移动6个位置而没有麻烦。
  • 如果当前结束指针不是换行符“\ n”,我们可以将它移回6个位置,但如果它是我们会遇到麻烦。

通过查看该表可以很容易地看到,开始指针需要移动2步和结束指针5个步骤,我想这是因为我们可以看到所有的数据(即我们所知道的过去和未来)。但这是否意味着我们必须通过以前的所有数据才能知道行的位置?

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

编辑: 添加了另一个示例图像:http://i.stack.imgur.com/FKCNg.png

回答

0

我不认为有必要通过所有数据回去。你需要回到两个'\ n'字符。

要开始指针移动到前行的开头:

  1. 如果前一个字符是“\ n”,然后返回一个字符。 (如果前一个字符不是'\ n',则继续步骤2.)
  2. 在一个循环中,一次向后倒转一个字符,直到达到另一个'\ n'或文本的开始位置。继续计算你在这个循环中向后移动了多少个字符。
  3. 最后,虽然前一个循环的计数大于一行的字符数,但向前移动一行的字符(并将计数减少一行的字符数)。继续前进线路,直到计数为一行或更少。你最终的目标是前一行的开始。
+0

谢谢,第一步帮了大忙!我用另一个示例缓冲区(http://i.stack.imgur.com/FKCNg.png)进行了测试,它似乎工作。这里最坏的情况是从第5条线移动到第4条线,因为它需要一直移动到起点。 步骤2的一个小优化:“如果您在一行字符后没有遇到任何”\ n“(包括步骤1),您可以停止循环,因为您已经到达目标。在新的例子中,可以看到从第3行到第2行。 – sandberg