Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2014, 16:53   #1
Mik92
Пользователь
 
Регистрация: 25.08.2014
Сообщений: 87
Вопрос Позиция текста в консоли

Привет, подскажите как можно сделать облегченное указание позиции вывода текста в консоле. На данный момент пользуюсь SetConsoleCursorPosition и постоянно перед выводом текста в нужное мне место приходится указывать координаты вывода cd_12.X = 31; cd_12.Y = 12;
В этом вся проблема, что я часто какую то строку должен убрать и тогда у меня посреди всего выведенного текста есть пустая строка и мне ее нужно как то убрать, а переписывать все позиции чтобы другие строки заняли это место постоянно надоедает. Можно ли как то воспользоваться другим вариантом вывода строк? Например чтобы оно само выводило каждую строку (при этом будет пропускать закомментированые те, что мне нужно временно убрать) не оставляя за собой пустой строки? подскажите..
Mik92 вне форума Ответить с цитированием
Старый 28.10.2014, 17:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Нет. Так не получится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2014, 17:34   #3
Mik92
Пользователь
 
Регистрация: 25.08.2014
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нет. Так не получится.
Вариантов вообще никаких нету?
Mik92 вне форума Ответить с цитированием
Старый 28.10.2014, 22:47   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

нефига не понял вопроса...
_Bers вне форума Ответить с цитированием
Старый 28.10.2014, 23:10   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

давай скриншоты с пояснениями прямо на них. иначе хренпоймичо.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.10.2014, 00:14   #6
Mik92
Пользователь
 
Регистрация: 25.08.2014
Сообщений: 87
По умолчанию

Строки на консоль вывожу так:
Код:
DWORD WINAPI prt(LPVOID)
{
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	setlocale(LC_ALL, "Russian"); // Русификатор
	SetConsoleTitle("Debug");
	HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD cd_1;
	COORD cd_2;
	COORD cd_3;
        ......
        ......
        cd_1.X = 25;
	cd_1.Y = 0;
	cd_2.X = 25;
	cd_2.Y = 1;
	cd_3.X = 25;
	cd_3.Y = 2;


        SetConsoleCursorPosition(hd, cd_1);
	printf("первая строка", 1, setlocale);

        SetConsoleCursorPosition(hd, cd_2);
	printf("вторая строка", 2, setlocale);

        SetConsoleCursorPosition(hd, cd_3);
	printf("и так далее", 3, setlocale);
При добавлении новой строки, мне приходится указывать позицию отрисовки текста (cd_4.X = 25; cd_4.Y = 4. Я часто убираю какие то не нужные строки на время и у меня остается пустая строка по среди всей консоли
Код:
SetConsoleCursorPosition(hd, cd_1);
	printf("первая строка", 1, setlocale);

      ??

        SetConsoleCursorPosition(hd, cd_3);
	printf("и так далее", 3, setlocale);

Как можно обойтись без указания положения текста? Чтобы нужный текст постоянно отображался по середине консоли и не имел пустых строк если я вдруг уберу какую нибудь из них.
Изображения
Тип файла: png original-044bc3a9753880d63b261c1942678d92.png (1.8 Кб, 935 просмотров)

Последний раз редактировалось Mik92; 29.10.2014 в 00:21.
Mik92 вне форума Ответить с цитированием
Старый 29.10.2014, 00:16   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Вы можете автоматизировать рутину.

Например, когда то очень давно, когда я ещё только только изучал плюсы, я сделал обертку для консоли имеющую такой дизайн:


Код:
console(GREEN)(CENTER) << "text1\n"<<"text2\n";
GREEN задает цвет текста.
CENTER указывает, что каждая строка должна выравниваться по центру.

Или можно например указать позицию явно:

Код:
console(10,10) << "text"<<endl;
console - это объект моего собственного класса, который условно говоря, работает по принципу схожему с cout,
но при этом умеет дополнительный функционал.

Я наделил свой механизм разным функционалом, вплоть до того, что можно было делать реакцию на клавиши, и на мышку, перетаскивать блок текста мышкой, выводить картинки.

А по сути, это просто обертка над winapi.


Резюмируя: как программист, вам следует подумать о том, как автоматизировать рутину, и обеспечить себя удобными инструментами для своей разработки.

Последний раз редактировалось _Bers; 29.10.2014 в 00:26.
_Bers вне форума Ответить с цитированием
Старый 29.10.2014, 00:21   #8
Mik92
Пользователь
 
Регистрация: 25.08.2014
Сообщений: 87
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
что значит "убираю какие то строки" ?
каким образом вы это делаете?
Убираю сам код вывода определенной строки

Цитата:
Сообщение от _Bers Посмотреть сообщение
Вы можете автоматизировать рутину.

Например, когда то очень давно, когда я ещё только только изучал плюсы, я сделал обертку для консоли имеющую такой дизайн:


Код:
console(GREEN)(CENTER) << "text1\n"<<"text2\n";
Текст будет выводиться центрируясь по центру, зеленым цветом.

console - это объект моего собственного класса, который условно говоря, работает по принципу схожему с cout,
но при этом умеет дополнительный функционал.

А по сути, это просто обертка над winapi.


Резюмируя: как программист, вам следует подумать о том, как автоматизировать рутину, и обеспечить себя удобными инструментами для своей разработки.
В том то и дело что я над этим и думаю, как выводить все строки программно добавляя позицию Y всегда +1 чтобы все показалось корректно. Я подумывал об что то типа
for (int no = 0; no < NO; no++)
Брать все выводимые строки и выводить их по одной при этом добавляя к позиции Y, +1. Но как, не понимаю либо я не правильно это все себе представляю но знаю, что это сделать как то можно

Последний раз редактировалось Stilet; 29.10.2014 в 07:34.
Mik92 вне форума Ответить с цитированием
Старый 29.10.2014, 01:00   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
Лампочка

Цитата:
Сообщение от Mik92 Посмотреть сообщение
В том то и дело что я над этим и думаю, как выводить все строки программно добавляя позицию Y всегда +1 чтобы все показалось корректно. Я подумывал об что то типа
for (int no = 0; no < NO; no++)
Брать все выводимые строки и выводить их по одной при этом добавляя к позиции Y, +1. Но как, не понимаю либо я не правильно это все себе представляю но знаю, что это сделать как то можно
я делал вот как:

при помощи winapi я запрашивал два экранных буфера.

один из них делал активным. и он был виден на экране.
а второй - задний, не видимый.

Кроме этого я держал в памяти массив строк.
Получилась матрица, где ширина - это количество символов, которое может влезть в экран консоли.
А высота - это количество строк, которое может влезть в консоль.

(на самом деле я хранил не просто символ, а ещё и его цвет)


ну так вот, когда мне было нужно вывести на экран строку, я на самом деле вносил данные о ней вот в этот вот свой массив.


после этого выводил весь цветной текст уже в задний экран консоли.
и уже после этого использовал специальную функцию winapi, которая делала задний экран передним (активным), а тот, который был передним - задним (не активным)

таким образом, все что я напечатал в заднем буфере мгновенно становилось видно в консольке.

Таким образом, я например организовал в косольке вывод анимации:

Код:
//выставляю режим "невидимых изменений"
//теперь вывод в косольку будет осуществляться только в мой массив данных
//на экране не будет видно никаких изменений
console(HIDE);

//устанавливаю режим выравнивания по центру
console(CENTER);

//здесь может быть куча всякого вывода.
//рисования аски-арт, или просто много текста
//например, можно изобразить интерфес, как в far
cout<<"text\n";
cout<<"text\n";
cout<<"text\n";
cout<<"text\n";

//показать на экране все изменения
console(VISIBLE);
Я помню, где то в интернете скачал текстовую анимацию человечка, и запустил её в своей консольке.

Трюк с двумя экранами называется "двойная буферизация". Сама идея стара, как мир.

Смысл её в том, что бы при изменении содержимого экрана, не было раздражающего мерцания.

Тогда анимация получается красивой и плавной.


Но если анимация не нужна, то можно печатать сразу в активный буфер

суть же идеи в том, что бы печатать в свой собственный массив данных, который полностью подчиняется вашей логике. Поэтому, вы сможете делать с ним все, что захотите.

И только в момент подтверждения изменений целиком копируете данные на экран.
_Bers вне форума Ответить с цитированием
Старый 29.10.2014, 01:26   #10
Mik92
Пользователь
 
Регистрация: 25.08.2014
Сообщений: 87
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
я делал вот как:

при помощи winapi я запрашивал два экранных буфера.

один из них делал активным. и он был виден на экране.
а второй - задний, не видимый.

Кроме этого я держал в памяти массив строк.
Получилась матрица, где ширина - это количество символов, которое может влезть в экран консоли.
А высота - это количество строк, которое может влезть в консоль.

(на самом деле я хранил не просто символ, а ещё и его цвет)


ну так вот, когда мне было нужно вывести на экран строку, я на самом деле вносил данные о ней вот в этот вот свой массив.


после этого выводил весь цветной текст уже в задний экран консоли.
и уже после этого использовал специальную функцию winapi, которая делала задний экран передним (активным), а тот, который был передним - задним (не активным)

таким образом, все что я напечатал в заднем буфере мгновенно становилось видно в консольке.

Таким образом, я например организовал в косольке вывод анимации:

Код:
//выставляю режим "невидимых изменений"
//теперь вывод в косольку будет осуществляться только в мой массив данных
//на экране не будет видно никаких изменений
console(HIDE);

//устанавливаю режим выравнивания по центру
console(CENTER);

//здесь может быть куча всякого вывода.
//рисования аски-арт, или просто много текста
//например, можно изобразить интерфес, как в far
cout<<"text\n";
cout<<"text\n";
cout<<"text\n";
cout<<"text\n";

//показать на экране все изменения
console(VISIBLE);
Я помню, где то в интернете скачал текстовую анимацию человечка, и запустил её в своей консольке.

Трюк с двумя экранами называется "двойная буферизация". Сама идея стара, как мир.

Смысл её в том, что бы при изменении содержимого экрана, не было раздражающего мерцания.

Тогда анимация получается красивой и плавной.


Но если анимация не нужна, то можно печатать сразу в активный буфер

суть же идеи в том, что бы печатать в свой собственный массив данных, который полностью подчиняется вашей логике. Поэтому, вы сможете делать с ним все, что захотите.

И только в момент подтверждения изменений целиком копируете данные на экран.
Ну мне кажется это слишком замудрено для моего проекта
Я попробую еще что нибудь, может что надумаю. Спасибо за идеи
Mik92 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета текста и фона в консоли. C. Ragers Помощь студентам 0 23.02.2013 18:00
Ввод текста в консоли Armind Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 11.12.2011 12:06
Форматирование текста в консоли Alexsandr Общие вопросы C/C++ 0 07.12.2011 12:48
изменение цвета выведенного текста в консоли с++ BleStaR Общие вопросы C/C++ 1 27.10.2010 08:57
Позиция текста по отношению к картинке в блоке <div>, CSS FINoM HTML и CSS 3 11.06.2009 16:31