Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Faerror
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
#1

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

04.08.2012, 12:06. Просмотров 1694. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2012, 12:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамическое изменение консольного окна, с избежанием появления полос прокрутки (C++):

Развертывание консольного окна
Как при включении программы развернуть консольное окно??? Если я это делаю...

_getch() вне консольного окна
как заставить работать _getch() вне консольного окна, например в chrome?

Получить размер консольного окна
Есть код:#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;Lib.h&quot; #include...

Создание окна из консольного приложения
Подскажите пожалуйста как создать окно в консольном с++

Предотвращение создания консольного окна
В общем, беда моя такова, что даже если я не использую ни cout, ни cin, ни даже...

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

6
-=ЮрА=-
Заблокирован
Автор FAQ
04.08.2012, 14:29 #2
Цитата Сообщение от 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:Думаю при желании стилями окна можно было бы выкинуть у консоли прокрутку вообще...
1
Изображения
 
Вложения
Тип файла: rar ConsoleSize.exe.rar (11.3 Кб, 12 просмотров)
Faerror
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
04.08.2012, 21:02  [ТС] #3
-=ЮрА=-, благодарю вас за ответ, но это не совсем то.
Необходимо изменять размер окна(не буфера), допустим по нажатию клавиши, и по нажатию клавиши же возвращать к исходному состоянию, не теряя уже выведенных данных и избегая полос прокрутки.

Так же интересует ваш код, строчка 6 и 11 - это инструкции stdio.h? Если да, можно ли где-то почитать подробнее о наполнении библиотеки, желательно на русском.
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.08.2012, 21:29 #4
Цитата Сообщение от Faerror Посмотреть сообщение
это инструкции stdio.h
- нет это вызовы подключенные через windows.h прочесть о них можно здесь
http://vsokovikov.narod.ru/New_MSDN_...oundwindow.htm
http://www.vsokovikov.narod.ru/New_M...tstdhandle.htm

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

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

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

На всякий случай упомяну, что сижу под Windows 7, набираю код в notepad++ и пользуюсь консольным компилятором из VC++ 10.0.
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.08.2012, 11:33 #6
Faerror, твои ошибки от того что кодировка проекта стоит ЮНИКОД, смени её на Multy-Byte-Characters Set, по этой ссылке скриншот того что надо изменить в настройках (это всего одна строка)
http://www.cyberforum.ru/win-api/thread631136-page2.html#post3318151
0
Faerror
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
05.08.2012, 15:11  [ТС] #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что надо изменить в настройках (это всего одна строка)
Сделал. Но на результат линковки через консоль эта настройка не влияет, помогает, только если изначально создавать проект в VC++.
0
05.08.2012, 15:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 15:11
Привет! Вот еще темы с решениями:

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

Пауза перед закрытием консольного окна
Здравствуйте, дорогие форумчане! Я только начал знакомиться с c++ и возникает...

Закрепление размеров консольного окна от изменений
Здравствуйте!!! Как закрепить консольный экран от изменения его размеров так...

Как увеличить размер консольного окна
Хочу увеличить ширину консольного окна но не пойму как это можно сделать к...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru