Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6

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

04.08.2012, 12:06. Показов 3326. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, коллеги. Я нуждаюсь в помощи и совете.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <locale>
using namespace std;
 
const int WIDTH = 59;
const int HEIGHT = 37;
 
HANDLE handleConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor00 = {100, true};
COORD curs00 = {0, 0};
COORD coord_buf01 = {59, 50};
COORD coord_buf02 = {100, 50};
COORD coord_buf03 = {-29, 50};
 
void gen_array(char g_array[HEIGHT][WIDTH]); 
void show_array(char sh_array[HEIGHT][WIDTH]);
void curs_array_gotoXY(int x, int y);
 
int main() {
  
  SMALL_RECT coord_rect_buf01 = {0, 0, 49, 58}; 
  SMALL_RECT coord_rect_buf02 = {0, 0, 49, 99};
  //SMALL_RECT coord_rect_buf03 = {0, 0, 49, -29};// test
  
    
  setlocale(LC_ALL, "Russian");
  SetConsoleTitle("**TEST**");
  SetConsoleCursorInfo(handleConsole, &cursor00); 
  
  
  
  system("mode con cols=59 lines=50");
  SetConsoleWindowInfo(handleConsole, true, &coord_rect_buf01);
  SetConsoleScreenBufferSize(handleConsole, coord_buf01);
  
  
  char array[HEIGHT][WIDTH];
  gen_array(array); 
  show_array(array);
   
  
  while(true){
  Sleep(2000);
  system("mode con cols=100 lines=50");  
  SetConsoleWindowInfo(handleConsole, true, &coord_rect_buf02);
  SetConsoleScreenBufferSize(handleConsole, coord_buf02);
  show_array(array);
  
  Sleep(1000);  
  system("mode con cols=59 lines=50");
  SetConsoleWindowInfo(handleConsole, true, &coord_rect_buf01);
  SetConsoleScreenBufferSize(handleConsole, coord_buf01);
  show_array(array);
  }
  
  //SetConsoleWindowInfo(handleConsole, true, &coord_rect_buf03); //test
  //SetConsoleScreenBufferSize(handleConsole, coord_buf03);
  
  
    
  
  cin.get();
  return 0;
}
 
 
void gen_array(char g_array[HEIGHT][WIDTH]) {
 
  int x, y;
  
  for(y = 0; y < HEIGHT; y++) {
    for(x = 0; x < WIDTH; x++) {
      g_array[y][x] = '0';
    }
  }
 
}
 
void show_array(char sh_array[HEIGHT][WIDTH]) {
    
  register int x;
  register int y;
  
  for(y = 0; y < HEIGHT; y++) {
    for(x = 0; x < WIDTH; x++) {
      cout << sh_array[y][x];
    }
    
    curs_array_gotoXY(0, y); 
  }
 
  
  
}
 
void curs_array_gotoXY(int x, int y) {
  COORD curs00 = {x, y};
  SetConsoleCursorPosition(handleConsole, curs00);
}
В данном виде код исправно функционирует, однако, в цикле while{} наблюдается мерцание отображенного массива, из-за того, что его приходится отрисовывать раз за разом. Не малую роль, на мой взгляд, играет функция system(), отвечающая за задание размеров окна.
Проблема в том, что:
1. Если через функцию system() задать большой размер окна, скажем 200х100, то при изменении буфера как в меньшую, так и в большую сторону ведет к возникновению полос прокрутки.
2. Если изначально задать размер окна меньше или равный нужному, при изменении размера буфера наблюдаются те же полосы.
3. Если однажды задать размер окна, а потом изменить с помощью system(), не добавляя функцию отрисовки массива, то после изменения его и не будет.
4. Если же использовать описанный выше код, наблюдается раздражающее мерцание.

Вопрос следующий:
Можно ли в процессе выполнения программы изменять размеры окна, избегая появления полос прокрутки и необходимости раз за разом отрисовывать массив?
И еще, там где установлен комментарий test, можно ли таким образом изменять буфер окна "влево"?

Добавлено через 17 часов 34 минуты
Ну хоть тапками покидайтесь, поругайтесь, что я чушь написал, а то непонятно же куда дальше плясать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2012, 12:06
Ответы с готовыми решениями:

Изменение масштаба при появлении полос прокрутки
Доброго времени! Меняется логотип и поля ввода по размеру при переходе по страницам сайта, т.к. на некоторых есть полоса прокрутки, а...

Динамическое изменение высоты подчиненной формы (взамен полосы прокрутки)
Доброго времени суток уважаемые форумчане! Подскажите каким образом можно отказаться от полос прокрутки в подчиненных формах в пользу...

Изменение размеров консольного окна
Можно ли, как-нибудь изменить размеры консольного окна? Если можно, то как?

6
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.08.2012, 14:29
Цитата Сообщение от Faerror Посмотреть сообщение
Ну хоть тапками покидайтесь, поругайтесь, что я чушь написал, а то непонятно же куда дальше плясать.
- Тапком кидаться не хочу, код править тоже - он мне кажется раздутым. Как я понял нужен константный размер окна консоли и чтобы возможности ни скролинга ни управления курсором и даже изменения размера консоли не было
Ниже простый код, который позволяет наложить все эти ограничения
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <windows.h>
 
int main()
{
    HWND hWnd   = GetForegroundWindow();
    HANDLE hOUT = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPOS = {0};
    while(TRUE)
    {
        MoveWindow(hWnd,200,300,250,100,TRUE);
        SetConsoleCursorPosition(hOUT,dwPOS);
        printf("Try to resize or move ME=P)\n");
        printf("You even cant run cursor;))");
        SetConsoleCursorPosition(hOUT,dwPOS);
        Sleep(10);
    }
    return 0;
}
PS:Думаю при желании стилями окна можно было бы выкинуть у консоли прокрутку вообще...
Изображения
 
Вложения
Тип файла: rar ConsoleSize.exe.rar (11.3 Кб, 17 просмотров)
1
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
04.08.2012, 21:02  [ТС]
-=ЮрА=-, благодарю вас за ответ, но это не совсем то.
Необходимо изменять размер окна(не буфера), допустим по нажатию клавиши, и по нажатию клавиши же возвращать к исходному состоянию, не теряя уже выведенных данных и избегая полос прокрутки.

Так же интересует ваш код, строчка 6 и 11 - это инструкции stdio.h? Если да, можно ли где-то почитать подробнее о наполнении библиотеки, желательно на русском.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.08.2012, 21:29
Цитата Сообщение от Faerror Посмотреть сообщение
это инструкции stdio.h
- нет это вызовы подключенные через windows.h прочесть о них можно здесь
http://vsokovikov.narod.ru/New... window.htm
http://www.vsokovikov.narod.ru... handle.htm

Цитата Сообщение от Faerror Посмотреть сообщение
Необходимо изменять размер окна(не буфера)
- кто сказал что я меняю размер буфера?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
MoveWindow(hWnd,200,300,250,100,TRUE);
- это что ни на есть самое настоящее изменение размера окна
0
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
04.08.2012, 23:52  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
прочесть о них можно здесь
О, этот замечательный ресурс я шерстил последние три дня, и теперь припоминаю, что пробовал подобие предложенного вами варианта, но столкнулся с проблемой, о которой напрочь забыл, переключившись на топорный system().



На всякий случай упомяну, что сижу под Windows 7, набираю код в notepad++ и пользуюсь консольным компилятором из VC++ 10.0.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
05.08.2012, 11:33
Faerror, твои ошибки от того что кодировка проекта стоит ЮНИКОД, смени её на Multy-Byte-Characters Set, по этой ссылке скриншот того что надо изменить в настройках (это всего одна строка)
Рисование линии мышью
0
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
05.08.2012, 15:11  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что надо изменить в настройках (это всего одна строка)
Сделал. Но на результат линковки через консоль эта настройка не влияет, помогает, только если изначально создавать проект в VC++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2012, 15:11
Помогаю со студенческими работами здесь

Изменение ширины окна консольного приложения
Доброго времени суток! Наткнулся на тему, но там как - то не особо описано.. Как же всё - таки изменить ширину консольки? Вот тут ещё...

Как запретить изменение размеров консольного окна
Программа с подключенным &quot;crt&quot;(uses crt). Нужно запретить изменять размеры командной строки. GraphABC подключить не могу. Добавлено...

Изменение названия консольного окна в панели задач
Добрый день всем! Скажите, есть ли возможность средствами Delphi изменить надпись выполняемого консольного приложения в Панели задач -...

Изменение размера текста и иконки окна консольного приложения
Здравствуйте уважаемы кодеры, есть к вам два вопроса один сильно ламерский, другой чуть менее.. Начну с первого: как поменять иконку...

Синхронное перемещение полос прокрутки
На форме есть вертикальная и горизонтальная полосы прокрутки, требуется синхронность: если перемещаешь одну полосу, то другая должна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru