Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Faerror
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
04.08.2012, 12:06     Динамическое изменение консольного окна, с избежанием появления полос прокрутки #1
Здравствуйте, коллеги. Я нуждаюсь в помощи и совете.

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

C++ Как увеличить размер консольного окна
C++ Ширина и высота окна консольного приложения(VS 2010)
C++ Как изменить заголовок консольного окна
C++ Как написать имя консольного окна из переменной
C++ Как написать имя консольного окна из переменной
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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:Думаю при желании стилями окна можно было бы выкинуть у консоли прокрутку вообще...
Изображения
 
Вложения
Тип файла: 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? Если да, можно ли где-то почитать подробнее о наполнении библиотеки, желательно на русском.
-=ЮрА=-
Заблокирован
Автор 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);
- это что ни на есть самое настоящее изменение размера окна
Faerror
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
04.08.2012, 23:52  [ТС]     Динамическое изменение консольного окна, с избежанием появления полос прокрутки #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
прочесть о них можно здесь
О, этот замечательный ресурс я шерстил последние три дня, и теперь припоминаю, что пробовал подобие предложенного вами варианта, но столкнулся с проблемой, о которой напрочь забыл, переключившись на топорный system().

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

На всякий случай упомяну, что сижу под Windows 7, набираю код в notepad++ и пользуюсь консольным компилятором из VC++ 10.0.
-=ЮрА=-
Заблокирован
Автор FAQ
05.08.2012, 11:33     Динамическое изменение консольного окна, с избежанием появления полос прокрутки #6
Faerror, твои ошибки от того что кодировка проекта стоит ЮНИКОД, смени её на Multy-Byte-Characters Set, по этой ссылке скриншот того что надо изменить в настройках (это всего одна строка)
Рисование линии мышью
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 15:11     Динамическое изменение консольного окна, с избежанием появления полос прокрутки
Еще ссылки по теме:

Развертывание консольного окна C++
c++ начинающий (пауза перед закрытием консольного окна) C++
C++ Получить размер консольного окна

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

Или воспользуйтесь поиском по форуму:
Faerror
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
05.08.2012, 15:11  [ТС]     Динамическое изменение консольного окна, с избежанием появления полос прокрутки #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что надо изменить в настройках (это всего одна строка)
Сделал. Но на результат линковки через консоль эта настройка не влияет, помогает, только если изначально создавать проект в VC++.
Yandex
Объявления
05.08.2012, 15:11     Динамическое изменение консольного окна, с избежанием появления полос прокрутки
Ответ Создать тему
Опции темы

Текущее время: 03:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru