2015-05-22 2 views
1

Я создаю GUI для запуска на STM32F429 микроконтроллере, он написан на C.Пользовательский интерфейс - прокрутка текста Просмотр

Проблемы у меня в том, как управлять прокрутку для просмотра текста. У меня есть буфер данных с символами ASCII, и я хочу управлять символом новой строки (\ n, ASCII-код 10), чтобы он дал новую строку в текстовом поле.

Вот небольшой пример буфера при прокрутке одной строки, без прокрутки и прокрутки вперед по одной строке: http://i.stack.imgur.com/4eK7w.png. Зеленое поле - это указатель начала, а красный - конечный указатель. Синие поля показывают строку текста (максимум 6 символов).

Прокрутка вперед одну строку:

Это один довольно легко.

  • Переместить указатель начала после следующего символа «\ n» или 6 позиций (что на первом месте).
  • Переместить указатель конца на следующий символ «\ n» или 6 позиций (что бы ни было первым).

прокрутки назад один ряд:

Это одна у меня возникают проблемы с.

  • Если мы не сталкиваемся с новой строкой при перемещении указателя начала, мы можем переместить его на 6 позиций без проблем.
  • Если текущий указатель конца не является символом новой строки «\ n», мы можем переместить его на 6 позиций, но если это произойдет, мы столкнемся с проблемой.

При взгляде на стол легко видеть, что указатель начала должен перемещать 2 шага, а конечный указатель - 5 шагов, и я думаю, это потому, что мы можем видеть все данные (то есть мы знаем о прошлом и будущее). Но означает ли это, что нам нужно пройти все предыдущие данные, чтобы знать, где расположены строки?

Если у кого-нибудь есть идеи, как это решить, я был бы очень благодарен!

EDIT: Добавлен еще один пример изображения: http://i.stack.imgur.com/FKCNg.png

ответ

0

Я не думаю, что это необходимо, чтобы вернуться через всех данных. Вам нужно вернуться к двум символам «\ n».

Для перемещения указателя начала к началу предыдущей строки:

  1. Если предыдущий символ является «\ п», а затем вернуться на один символ. (Если предыдущий символ не «\ n», переходите к шагу 2.)
  2. В цикле перейдите назад на один символ за раз, пока не достигнете другого «\ n» или начала текста. Укажите количество символов, которые вы переместили назад в этом цикле.
  3. Наконец, в то время как счетчик из предыдущего цикла больше символов одной строки, переместите знаки символов одной строки (и уменьшите количество символов на одну строку). Продолжайте продвигать линии до тех пор, пока счет не станет одной строкой или меньше.В конце концов, это начало предыдущей строки.
+0

Спасибо, первый шаг очень помог! Я проверил с другим буфером примеров (http://i.stack.imgur.com/FKCNg.png), и он, похоже, работает. В худшем случае здесь происходит переход от строки 5 к 4, так как она требует полного перехода к началу. Небольшая оптимизация для шага 2: «Если вы не встретите никаких« \ n »(шаг 1 в комплекте) после символов одной строки, вы можете остановить цикл, как только вы достигли цели». Это можно увидеть, перемещаясь от строки 3 к 2 в новом примере. – sandberg

Смежные вопросы