Я пытаюсь портировать эту функцию (написана на FreeBasic) на C ++. Следующий код напечатает границу символа по краю окна консоли:
#Define HORIZONTAL_SYMBOL 205
#Define VERTICAL_SYMBOL 186
#Define TOP_LEFT_CORNER 201
#Define TOP_RIGHT_CORNER 187
#Define BOTTOM_LEFT_CORNER 200
#Define BOTTOM_RIGHT_CORNER 188
Sub print_frame(ByVal max_column As Short = 80, ByVal max_row As Short = 25, ByVal start_x As Short = 1, ByVal start_y As Short = 1)
Dim As Byte cycles
'Print top line
Locate(start_y,start_x)
? Tab(start_x); Chr(TOP_LEFT_CORNER); String(max_column-2, Chr(HORIZONTAL_SYMBOL)); Chr(TOP_RIGHT_CORNER);
'Body
Do
cycles += 1
? Tab(start_x); Chr(VERTICAL_SYMBOL); Tab(max_column+start_x-1);
Chr(VERTICAL_SYMBOL);
Loop Until cycles = max_row-2
'Print bottom line
? Tab(start_x); Chr(BOTTOM_LEFT_CORNER); String(max_column-2,
Chr(HORIZONTAL_SYMBOL)); Chr(BOTTOM_RIGHT_CORNER);
End Sub
Screen 0
print_frame()
GetKey
Принять к сведению Screen 0
во время операции он будет инициализировать режим консоли Windows с 80 столбцами / 25 строками (что-то, чего я еще не нашел / замены в C ++). Чтобы установить этот режим вручную, запустите оболочку Windows, щелкните правой кнопкой мыши значок программы на панели программ и выберите «Свойства» (надеюсь, это называется, моя установка Windows выполнена на немецком языке). В новом окне выберите вкладку «Макет» и установите размер буфера и размер окна на 80×25.
Пожалуйста, игнорируйте #define
линий, программа использует различные символы в Linux.
Это была моя попытка перенести эту функцию на C ++:
#include "rlutil.h"
void print_frame(short int max_column = rlutil::tcols(), short int max_row = rlutil::trows(), short int x = 1, short int y = 1) {
short int cycles = 0;
// Print top line
rlutil::locate(x,y);
std::cout << char (201) << std::string(max_column-2, 205) << char (187);
// Body
while (cycles < max_row-2) {
cycles++;
rlutil::locate(x,y+cycles);
std::cout << char (186) << std::string(max_column-2, 0) << char (186);
}
// Print bottom line
rlutil::locate(x,y+max_row-1);
std::cout << char (200) << std::string(max_column-2, 205) << char (188);
}
int main () {
print_frame();
}
Приведенный выше код использует функцию под названием rlutil::locate()
, который не написан мной и частью библиотеки под названием «rlutils.h» (Google, если вам это нужно).
Другие функции библиотеки, rlutil::tcols()
а также rlutil::trows()
вернуть количество строк и столбцов в окне консоли.
Моя проблема / вопрос в том, что, хотя функция FreeBasic не прокручивает текст вниз (что приведет к обрезанию верхней границы), код C ++ делает. Как я могу избежать этого поведения?
РЕДАКТИРОВАТЬ: я нашел способ предотвратить прокрутку с помощью putchar()
(печатать все, кроме последнего символа с std::cout
и положить последний символ с putchar()
), но я все еще ищу более ясный способ сделать это.
Задача ещё не решена.
Других решений пока нет …