Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Обучение и начало програмирования на С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://forum.sources.ru/index.php?showtopic=64033

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 12:03 14-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста, как мне вывести в консоли на синем экране желтые буквы? И как рисовать псевдографику в консоли (таблицы разные, кнопочки и т.д.).
 Заранее спасибо!

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 23:38 14-03-2006
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это тебе лучше напрямую в видеопамять рисовать. В своё время ещё под ДОСом так делали. Здесь, думаю, технология та же. Надо лишь получить выход на экранный буфер с текстом.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 10:18 15-03-2006
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Xarde
А ты проблем с access violation не боишься? Кто в виндах в консольном приложении тебя к видеопамяти пустит?
NNS
Смотри системные вызовы SetConsoleTextAttribute и WriteConsole

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 14:05 15-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk
Спасибо. А как при помощи этих функций сделать так, чтоб экран был синим а в его середине вывелся определенный текст?
 
И еще вопрос. Есть файл со следующим содержимым:
 
22 23
33 67
97 38
41 53
66 78
Строка_1
61 45
82 31
96 00
45 77
57 89
Строка_2
 
Нужно между 66 78 и "Строка_1" и между 57 89 "Строка_2" поместить по 2 числа. Напрмер между 66 78 и "Строка_1" поместить 32 45, а между  57 89 и "Строка_2" вписать 87 21. Ка это реализовать?

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 19:07 16-03-2006
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NNS

Цитата:
А как при помощи этих функций сделать так, чтоб экран был синим а в его середине вывелся определенный текст?  

В винде при работе с консолью много разных функций. В том числе, есть некий аналог работы с видеопамятью. То есть, создаешь экранный буфер, каждый элемент его - структура CHAR_INFO, в которой один из элементов - маска цветов, другой - символ.
Заполняешь его чем хочешь, потом, просто делаешь его активным.
Пример из MSDN:

Код:
 
#include <windows.h>  
 
VOID main(void)  
{  
    HANDLE hStdout, hNewScreenBuffer;  
    SMALL_RECT srctReadRect;  
    SMALL_RECT srctWriteRect;  
    CHAR_INFO chiBuffer[160]; // [2][80];  
    COORD coordBufSize;  
    COORD coordBufCoord;  
    BOOL fSuccess;  
 
    // Get a handle to the STDOUT screen buffer to copy from and  
    // create a new screen buffer to copy to.  
 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);  
    hNewScreenBuffer = CreateConsoleScreenBuffer(  
       GENERIC_READ |           // read/write access  
       GENERIC_WRITE,  
       0,                       // not shared  
       NULL,                    // no security attributes  
       CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE  
       NULL);                   // reserved; must be NULL  
    if (hStdout == INVALID_HANDLE_VALUE ||  
            hNewScreenBuffer == INVALID_HANDLE_VALUE)  
    {
        MyErrorExit("CreateConsoleScreenBuffer");  
    }
 
    // Make the new screen buffer the active screen buffer.  
 
    if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )  
        MyErrorExit("SetConsoleActiveScreenBuffer");  
 
    // Set the source rectangle.  
 
    srctReadRect.Top = 0;    // top left: row 0, col 0  
    srctReadRect.Left = 0;  
    srctReadRect.Bottom = 1; // bot. right: row 1, col 79  
    srctReadRect.Right = 79;  
 
    // The temporary buffer size is 2 rows x 80 columns.  
 
    coordBufSize.Y = 2;  
    coordBufSize.X = 80;  
 
    // The top left destination cell of the temporary buffer is  
    // row 0, col 0.  
 
    coordBufCoord.X = 0;  
    coordBufCoord.Y = 0;  
 
    // Copy the block from the screen buffer to the temp. buffer.  
 
    fSuccess = ReadConsoleOutput(  
       hStdout,        // screen buffer to read from  
       chiBuffer,      // buffer to copy into  
       coordBufSize,   // col-row size of chiBuffer  
       coordBufCoord,  // top left dest. cell in chiBuffer  
       &srctReadRect); // screen buffer source rectangle  
    if (! fSuccess)  
        MyErrorExit("ReadConsoleOutput");  
 
    // Set the destination rectangle.  
 
    srctWriteRect.Top = 10;    // top lt: row 10, col 0  
    srctWriteRect.Left = 0;  
    srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79  
    srctWriteRect.Right = 79;  
 
    // Copy from the temporary buffer to the new screen buffer.  
 
    fSuccess = WriteConsoleOutput(  
        hNewScreenBuffer, // screen buffer to write to  
        chiBuffer,        // buffer to copy from  
        coordBufSize,     // col-row size of chiBuffer  
        coordBufCoord,    // top left src cell in chiBuffer  
        &srctWriteRect);  // dest. screen buffer rectangle  
    if (! fSuccess)  
        MyErrorExit("WriteConsoleOutput");  
    Sleep(10000);  
 
    // Restore the original active screen buffer.  
 
    if (! SetConsoleActiveScreenBuffer(hStdout))  
        MyErrorExit("SetConsoleActiveScreenBuffer");  
 
}
 

 
Второй вопрос.
А там то в чем проблема?
Берешь файл, переписываешь его и в нужном месте подставляешь. В этот файл добавить уже ничего не удастся. Хотя... В принципе - через маппирование файлов на память можно и это решить. Тебе как надо? Просто или с извратами?

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 07:42 17-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk
Спасибо.
 
По поводу второго вопроса.
 

Цитата:
Тебе как надо? Просто или с извратами?

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

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 19:44 17-03-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk

Цитата:
В принципе - через маппирование файлов на память можно и это решить.

Так это по сути то же самое переписывание получится. Только, как верно подмечено, с извратами.

Всего записей: 6107 | Зарегистр. 22-10-2005 | Отправлено: 20:42 17-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Объясните, плиз, толком как это написать. А то я уже замучался

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 18:13 18-03-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NNS
Открываешь исходный файл, создаёшь новый. Считываешь строку из исходного, записываешь в новый. В месте, где нужно добавить строку - сначала записываешь добавляемую строку, затем строку из исходного. Повторяешь, пока исходный файл не кончится. Всё.

Всего записей: 6107 | Зарегистр. 22-10-2005 | Отправлено: 20:08 18-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Хм... А с именем файла как быть? Т.е. Мне то нужно чтоб имя файла не менялось. К примеру, если первый файл имеет название File.txt, я создаю другой файл с именем File_1.txt и записываю в него "исправленный" вариант. Чтоб вернуть информацию в File.txt, мне придется гнать информацию из File_1.txt, обратно в File.txt. Долговато...

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 21:59 18-03-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NNS
А зачем гнать информацию обратно? Закрываешь и удаляешь File.txt, потом переименовываешь File_1.txt в File.txt. Пара строчек в программе, доли секунды на выполнение.

Всего записей: 6107 | Зарегистр. 22-10-2005 | Отправлено: 22:26 18-03-2006
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NNS
Немного добавлю. Вместо File_1.txt лучше все-таки создать файл с уникальным именем во временном каталоге, а затем его, как было сказано выше, переименовать.
Abs62
Ну я бы не сказал, что то же самое. Если не ошибаюсь, там можно уже и memcpy использовать. Только надо размер правильно изначально выставить. Но где то вглубине, на уровне ОС, наверно действия останутся прежними.
Извратов в этом способе на порядок больше чем просто при копировании и переименовании. А уж по количеству разнообразных системных вызовов...  

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 07:23 20-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Mickey_from_nsk
 
Спасибо вам, вы мне очень помогли!
 
Подскажите пожалуйста аналог под виндовс, ДОСовской функции clrscr();

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 20:08 23-03-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NNS
Для приложения с оконным интерфейсом - InvalidateRect окну. Это заставит его перерисоваться заново.
Для консольного приложения можно использовать уже упомянутую Mickey_from_nsk WriteConsoleOutput.

Всего записей: 6107 | Зарегистр. 22-10-2005 | Отправлено: 21:05 23-03-2006
NNS



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
Для консольного приложения можно использовать уже упомянутую Mickey_from_nsk WriteConsoleOutput.  

Можно по подробней, как ее использовать для отчистки консольного экрана.

Всего записей: 137 | Зарегистр. 03-01-2005 | Отправлено: 22:10 23-03-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NNS
Ну, например, так:

Код:
 
#define FILL_CHAR ' '
#define FILL_ATTRIBUTE BACKGROUND_BLUE
 
BOOL ClearConsole()
{
HANDLE hConsole;
CONSOLE_SCREEN_BUFFER_INFO BufInfo;
WORD size;
CHAR_INFO *pBuf;
SMALL_RECT WriteRegion;
COORD dwBufferCoord;
BOOL ret;
 
  hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(hConsole,&BufInfo);
  size=BufInfo.dwSize.X*BufInfo.dwSize.Y;
  pBuf=new CHAR_INFO[size];
  for(WORD i=0;i<size;i++) {
    pBuf[i].Char.AsciiChar=FILL_CHAR;
    pBuf[i].Attributes=FILL_ATTRIBUTE;
  }
  dwBufferCoord.X=dwBufferCoord.Y=0;
  WriteRegion.Top=WriteRegion.Left=0;
  WriteRegion.Right=BufInfo.dwSize.X-1;
  WriteRegion.Bottom=BufInfo.dwSize.Y-1;
  ret=WriteConsoleOutput(hConsole,pBuf,BufInfo.dwSize,dwBufferCoord,&WriteRegion);
  delete[] pBuf;
  return(ret);
}
 
 
Примечания:
1. Проверки возвращаемых функциями значений добавить по уму.
2. Хэндл консольного буфера, наверно, удобнее будет передавать в функцию как параметр.
3. Символ и атрибут заполнения буфера выставить по вкусу.

Всего записей: 6107 | Зарегистр. 22-10-2005 | Отправлено: 00:51 24-03-2006
Mickey_from_nsk

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно обойтись и без выделения памяти, хотя, наверно, это будет дольше.
Просто - по байтно выводить через WriteConsoleOutputCharacter. IMHO оно для этих целей больше подходит.

Всего записей: 636 | Зарегистр. 21-10-2002 | Отправлено: 12:46 24-03-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mickey_from_nsk
Тогда уж лучше FillConsoleOutputCharacter. Эффективнее получится.

Всего записей: 6107 | Зарегистр. 22-10-2005 | Отправлено: 21:00 24-03-2006
NPC



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
господа, имееться Microsoft Visual C++ 2003, с MSDN july 2004.
скомпилировал проект, но как в окошко вешать разные компоненты???
ну всмысле под меню белое окно.
"win 32 project"

Всего записей: 8943 | Зарегистр. 17-02-2005 | Отправлено: 11:58 25-03-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Обучение и начало програмирования на С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru