Мое приложение требует, чтобы консоль была встроенав окно приложения, например, в такой программе, как AutoCAD, где консоль находится в нижней части окна в ожидании команд.
Мне нужна консоль в моем приложении, чтобы я мог изменять переменные и другие вещи, поэтому консоль не должна быть полностью раздутой оболочкой.
На данный момент у меня есть простая консоль в моем приложении, но она кажется очень неуклюжей по сравнению с терминалом (оболочкой), какой я хочу видеть консоль.
Я сделал это с помощью имеющейся у меня консоли: когда пользователь нажимает клавишу TAB
, которую показывает консоль, затем он может ввести свою команду/строку; После нажатия клавиши Return
введенная строка анализируется, и команда обрабатывается.
Я использую объекты sf::Text
для вывода текста в окне приложения.
Всего используется 5 объектов sf::Text
, 4 для предыдущих команд/сообщений об ошибках и 1 для текущей командной строки. При нажатии клавиши Return
4-й sf::Text
меняет свою текущую строку на 3-ю, 3-ю на 2-ю, 2-ю на 1-ю и 1-ю на текущую команду string, то текущая командная строка очищается и снова готова к вводу.Таким образом, остается место для 4 «историй» команд и/или ошибок. Не самый лучший, но это было лучшее, что я мог придумать. Конечно, объем истории можно изменить, добавив больше объектов sf::Text
.
Итак, вот как я вывожу консоль на экран
sf::RectangleShape rectangle;
rectangle.setSize(sf::Vector2f(App->getSize().x, App->getSize().y / 3));
rectangle.setPosition(0, 0);
rectangle.setFillColor(sf::Color::black);
App->draw(rectangle); // This renders the console looking background rectangle
App->draw(CLine); // This renders the current command line
for(int i = 4; i >= 0; --i) // This renders the history as described above, their idevidual positions are setup earlier on in the program
{
CHistory[i].setString(CS[i]);
App->draw(CHistory[i]);
}
Приложение
— это просто sf::RenderWindow*
Мой общий вопрос: встроить консоль в мое окно SFMLбез того, чтобы это было просто изображение текстовых объектов, визуализированных так, чтобы они выглядели как консоль, как я сделал выше. Я бы предпочел иметь настоящую консоль/оболочку/терминал в своем приложении. Как и стандартная оболочка bash, но, конечно же, мой собственный интерпретатор оболочки.