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

时间:2015-05-22 13:56:43

标签: c user-interface embedded

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

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

以下是向后滚动一行时的缓冲区的一个小示例,没有滚动并向前滚动一行:http://i.stack.imgur.com/4eK7w.png。绿色框是开始指针,红色框是结束指针。蓝色框显示一行文本(最多6个字符)。

向前滚动一行:

这个很容易。

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

向后滚动一行:

这是我遇到麻烦的。

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

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

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

修改 添加了另一个示例图片:http://i.stack.imgur.com/FKCNg.png

1 个答案:

答案 0 :(得分:0)

我认为有必要返回所有数据。你需要回到最近的两个' \ n'字符。

将开始指针移动到上一行的开头:

  1. 如果上一个字符是' \ n',则返回一个字符。 (如果前一个字符不是' \ n'则继续执行步骤2.)
  2. 在一个循环中,一次向后移动一个角色,直到你到达另一个角色为止。\ n' \ n'或文本的开头。记下你在这个循环中向后移动了多少个字符。
  3. 最后,虽然前一个循环的计数大于一行的字符数,但向前移动一行的字符数(并将计数减少一行的价值)字符)。继续前进直到计数为一行或更少。你最终的位置是上一行的开头。