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

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

04.08.2012, 12:06. Показов 2493. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2012, 12:06
Ответы с готовыми решениями:

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

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

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

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

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:Думаю при желании стилями окна можно было бы выкинуть у консоли прокрутку вообще...
Изображения
 
Вложения
Тип файла: rar ConsoleSize.exe.rar (11.3 Кб, 13 просмотров)
1
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... 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  [ТС] 5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
прочесть о них можно здесь
О, этот замечательный ресурс я шерстил последние три дня, и теперь припоминаю, что пробовал подобие предложенного вами варианта, но столкнулся с проблемой, о которой напрочь забыл, переключившись на топорный system().

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


На всякий случай упомяну, что сижу под Windows 7, набираю код в notepad++ и пользуюсь консольным компилятором из VC++ 10.0.
0
Заблокирован
Автор FAQ
05.08.2012, 11:33 6
Faerror, твои ошибки от того что кодировка проекта стоит ЮНИКОД, смени её на Multy-Byte-Characters Set, по этой ссылке скриншот того что надо изменить в настройках (это всего одна строка)
Рисование линии мышью
0
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
05.08.2012, 15:11  [ТС] 7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что надо изменить в настройках (это всего одна строка)
Сделал. Но на результат линковки через консоль эта настройка не влияет, помогает, только если изначально создавать проект в VC++.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2012, 15:11

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru