自定义 GUI - 可滚动文本视图
Custom GUI - Scrollable Text View
我正在为 运行 在 STM32F429 微控制器上创建一个 GUI,它是用 C 语言编写的。
我遇到的问题是如何管理文本视图的滚动。我有一个带有 ASCII 字符的数据缓冲区,我想管理换行符(\n,ASCII 代码 10),以便它在文本框中给出一个新行。
下面是回滚一行时缓冲区的小例子,不滚动又向前滚动一行:http://i.stack.imgur.com/4eK7w.png。绿色框是起始指针,红色框是结束指针。蓝色框显示一行文本(最多 6 个字符)。
向前滚动一行:
这个很简单。
- 将开始指针移动到下一个“\n”字符之后或 6 个位置(以先到者为准)。
- 将结束指针移动到下一个“\n”字符或 6 个位置(以先到者为准)。
向后滚动一行:
这是我遇到的问题。
- 如果我们在向后移动起始指针时没有遇到换行符,我们可以毫无问题地将它移动 6 个位置。
- 如果当前结束指针不是换行符“\n”,我们可以将它向后移动 6 个位置,但如果是,我们 运行 就会遇到麻烦。
通过查看 table 很容易看出起始指针需要移动 2 步,结束指针需要移动 5 步,我认为这是因为我们可以看到所有数据(即我们知道过去和未来)。但这是否意味着我们必须遍历所有以前的数据才能知道行所在的位置?
如果有人对如何解决这个问题有任何想法,我将不胜感激!
编辑:
添加了另一个示例图像:http://i.stack.imgur.com/FKCNg.png
我认为没有必要返回全部数据。您最多需要返回两个'\n'字符。
要将开始指针移动到上一行的开头:
- 如果前一个字符是'\n',则返回一个字符。 (如果前一个字符不是'\n'则继续第2步。)
- 在循环中,一次向后一个字符,直到到达另一个“\n”或文本的开头。记下您在此循环中向后移动了多少个字符。
- 最后,当前一个循环的计数大于一行字符时,向前移动一行字符(并将计数减去一行字符)。继续前进行,直到计数为一行或更少。你结束的地方是上一行的开始。
我正在为 运行 在 STM32F429 微控制器上创建一个 GUI,它是用 C 语言编写的。
我遇到的问题是如何管理文本视图的滚动。我有一个带有 ASCII 字符的数据缓冲区,我想管理换行符(\n,ASCII 代码 10),以便它在文本框中给出一个新行。
下面是回滚一行时缓冲区的小例子,不滚动又向前滚动一行:http://i.stack.imgur.com/4eK7w.png。绿色框是起始指针,红色框是结束指针。蓝色框显示一行文本(最多 6 个字符)。
向前滚动一行:
这个很简单。
- 将开始指针移动到下一个“\n”字符之后或 6 个位置(以先到者为准)。
- 将结束指针移动到下一个“\n”字符或 6 个位置(以先到者为准)。
向后滚动一行:
这是我遇到的问题。
- 如果我们在向后移动起始指针时没有遇到换行符,我们可以毫无问题地将它移动 6 个位置。
- 如果当前结束指针不是换行符“\n”,我们可以将它向后移动 6 个位置,但如果是,我们 运行 就会遇到麻烦。
通过查看 table 很容易看出起始指针需要移动 2 步,结束指针需要移动 5 步,我认为这是因为我们可以看到所有数据(即我们知道过去和未来)。但这是否意味着我们必须遍历所有以前的数据才能知道行所在的位置?
如果有人对如何解决这个问题有任何想法,我将不胜感激!
编辑: 添加了另一个示例图像:http://i.stack.imgur.com/FKCNg.png
我认为没有必要返回全部数据。您最多需要返回两个'\n'字符。
要将开始指针移动到上一行的开头:
- 如果前一个字符是'\n',则返回一个字符。 (如果前一个字符不是'\n'则继续第2步。)
- 在循环中,一次向后一个字符,直到到达另一个“\n”或文本的开头。记下您在此循环中向后移动了多少个字符。
- 最后,当前一个循环的计数大于一行字符时,向前移动一行字符(并将计数减去一行字符)。继续前进行,直到计数为一行或更少。你结束的地方是上一行的开始。