Здравствуйте, def0e0, Вы писали: D>Проблема в том, что мне необходимо в одном из окон нарисовать график. Но как это сделать, если весь интерфейс рисуется в текстовом режиме символами?
Может, сделать так. Основной интерфейс сделан с помощью Turbo Vision. Когда нужно показать пользователю график, программа переключается в графический режим и рисует картинку с помощью graphics.h. После того как пользователь увидел всё что хотел, он жмёт Esc и программа возвращается обратно в текстовый режим, в котором за содержимое экрана отвечает Turbo Vision.
Пётр Седов (ушёл с RSDN)
Re[3]: текстовый+графический режим в DOS?
От:
Аноним
Дата:
16.01.08 19:17
Оценка:
Здравствуйте, Пётр Седов, Вы писали:
ПС>В смысле? Allegro сам умеет рисовать GUI.
В прямом смысле — в библиотеке MASking сделано много полезных классов-обёрток вокруг allegro, поэтому через MASking работать с полноценным GUI удобнее.
Re[2]: текстовый+графический режим в DOS?
От:
Аноним
Дата:
17.01.08 07:35
Оценка:
Поддержу.
GUI рисовать в ДОСе в графическом режиме — очень накладно — нет драйверов (если не закладываться на определённое железо), соотв. почти всё рисуется посредством проца, соотв. при нормальных разрешениях (больше 800*600) нужно хотя бы Р4.
Поэтому если есть возможность — рисовать GUI через TurboVision.
Хотя надо отметить, если хорошо подойти к делу GUI в графическом режиме можно нарисовать очень достойный.
Здравствуйте, Аноним, Вы писали:
А>Это моя текущая работа (т.е. не теоретический, а практический совет). А>Компилятор DJGPP, графика рисуется посредством allegro. А>GUI можно рисовать непосредственно через allegro, но не очень удобно. А>Есть довольно удобная либа — MASking — основные виджеты GUI поверх allegro. А>Кстати, если потом будет переход под линух (а в случае серьёзной программы будете вынуждены) то всё это "безобразие" вроде как компилится под никсы (сам пока ещё не пробовал). А>Но это в случае, если нет возможности обойтись TurboVision — ибо по простоте и быстродействию с текстовым режимом соревноваться не просто.
Собрал и посмотрел allegro под linux. Посмотрел примеры... Пока вроде подходит. Попытался собрать в DOS'е при попытке сделать make останавливается на следующей ошибке:
c:\src\allegro>make
Compiling Allegro for djgpp, optimised. Please wait...
obj/djgpp/asmdef.exe obj/djgpp/asmdef.inc
writing structure offsets into obj/djgpp/asmdef.inc...
gcc -Wall -Wno-unused -I. -I./include -x assembler-with-cpp -o obj/djgpp/alleg/i
blit16.o -c src/i386/iblit16.s
c:/djgpp/tmp\ccai4cjl: Assembler messages:
c:/djgpp/tmp\ccai4cjl:354: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:419: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:421: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:437: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:437: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:445: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:445: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:451: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:451: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:496: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:498: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:516: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:520: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:565: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:567: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:587: Error: operands given don't match any known 386 instruction
c:/djgpp/tmp\ccai4cjl:587: Error:
c:\src\allegro>
Перед make делал fix.bat djgpp --crlf --nomsvcpaths. В чем дело? Как собрать в DOS'e?
Здравствуйте, Пётр Седов, Вы писали:
ПС>Здравствуйте, def0e0, Вы писали: D>>Проблема в том, что мне необходимо в одном из окон нарисовать график. Но как это сделать, если весь интерфейс рисуется в текстовом режиме символами? ПС>Может, сделать так. Основной интерфейс сделан с помощью Turbo Vision. Когда нужно показать пользователю график, программа переключается в графический режим и рисует картинку с помощью graphics.h. После того как пользователь увидел всё что хотел, он жмёт Esc и программа возвращается обратно в текстовый режим, в котором за содержимое экрана отвечает Turbo Vision.
Я бы наверно так и сделал, но мне необходимо вместе с графиками отображать и текстовые данные. Можно и текст в графическом режиме рядом расположить, но тогда смысл мне отдельно в текстовом режиме делать только меню с настройками... Как-то не удобно мне кажется...
У меня есть скриншот программы (постараюсь в ближайшее время выложить), где в текстовом режиме в отдельном нарисованном окне рисуют графики и одновременно рядом отображается текст. Вот мне бы узнать как это они сделали...
PS: На графику мне нужно тратить как можно меньше ресурсов, так как главное успеть опросить, принять и обработать данные от устройств, а потом уже отображать полученные данные. Поэтому то и хочется весь интерфейс сделать в текстовом режиме, а графики рядом в небольшом окошке...
Имейте в виду, что большой, красивый, удобный GUI, написанный на MASking будет требовать производительного процессора (особенно в больших разрешениях — 800*600 ещё терпимо работает на Celeron P3 800 MGz) — об этом я ниже писал (работает в ДОСе через VESA биоса, а оно процом рисуется).
И второе — я работаю с версией allegro 4.2.0 и MASking 0.79. Они дружат. Пробовал собирать последние версии — были проблемы даже при сборке, что там будет если пробовать запускать — не знаю.
Если изначально ориентироваться на никс какой-нть, то надо смотреть в сторону более распространённых GUI (QT там всякие и тд). Иначе много всего придётся самому ковырять в allegro и MASking (есть сырые и не удобные места).
Здравствуйте, Кодт, Вы писали:
К>Чисто теоретически, можно сделать текстовый режим поверх графического. (Даже старый добрый CGA это поддерживает). К>Но беда в том, что TurboVision работает напрямую с видеобуфером, а не с терминалом, поэтому в лоб, просто переключив видеорежим, не получится.
А если не использовать TurboVision, то как "теоретически" можно сделать текстовый режим поверх графического?
Здравствуйте, def0e0, Вы писали:
К>>Чисто теоретически, можно сделать текстовый режим поверх графического. (Даже старый добрый CGA это поддерживает). К>>Но беда в том, что TurboVision работает напрямую с видеобуфером, а не с терминалом, поэтому в лоб, просто переключив видеорежим, не получится.
D>А если не использовать TurboVision, то как "теоретически" можно сделать текстовый режим поверх графического?
Это не задача TV. Оно-то как раз очень не любит такое, потому что работает с текстовым буфером напрямую.
А теория очень простая.
Вариант номер 1: просто рисовать моноширинным шрифтом в графический буфер.
Вариант номер 2: завести текстовый буфер в основной памяти, и каждый раз, когда его содержимое меняется — смотреть вариант номер 1.
Переключать же видеорежимы — это смотри модуль Graph и драйвера cga.bgi, egavga.bgi к нему.
Здравствуйте, def0e0, Вы писали:
D>Пишу программу под DOS на С++. ..., для этого использую библиотеку Turbo Vision. Проблема в том, что мне необходимо в одном из окон нарисовать график. Но как это сделать, если весь интерфейс рисуется в текстовом режиме символами? Как в текстовом режиме работать с отдельными пикселями? Или может есть какая-то библиотека с помощью которой можно создавать пользовательский интерфейс в графическом режиме?
Давненько я написал библиотечку для переключения Turbo Vision в графический режим, 100% совместимую с Turbo Vision, оказалось таки довольно легко, по сути два места перекрыть:
Здравствуйте, Аноним, Вы писали:
А>Давненько я написал библиотечку для переключения Turbo Vision в графический режим, 100% совместимую с Turbo Vision, оказалось таки довольно легко, по сути два места перекрыть:
Ух ты! То что надо! Можешь поделится библиотечкой?
ДимДимыч пишет: > Здравствуйте, def0e0, Вы писали: > > D> Но как это сделать, если весь интерфейс рисуется в текстовом режиме > символами? Как в текстовом режиме работать с отдельными пикселями? > > Вообще способ есть, но он Вам вряд ли подойдет. Этот способ позволяет > выводить в текстовом режиме двоичные изображения размером 128x128 с > раскраской отдельного знакоместа 8x16. Реализуется путем > перепрограммирования верхней половины таблицы знакогенератора. > Изображения символов с кодами больше 127 при этом естественно > недоступны. Этот способ используется для вывода логотипа при старте > системы.
Продолжаю тему. Вместо того, чтобы менять старшую половину символов,
начиная с EGA, можно установить режим 512 символов вместо обычных 256
ценой одного бита цвета символа. Дело в том, что таблиц шрифтов может
быть не одна. В видеопамять EGA можно загрузить 4 шрифта, в VGA — 8
одновременно. Специальные видеорегистры позволяют переключать нулевой и
первый шрифт между загруженными. Обычно они указывают на одну и ту же
таблицу — на нулевую. Но можно поставить на разные, это и будет режим
512 символов. Нулевой или первый шрифт будет выбран, зависит от цвета
символа. В стандартной палитре это бит яркости. То есть, если не менять
палитру, то блеклые символы будут одним шрифтом, а светлые — другим. Но,
конечно, лучше поменять. В 8 цветов уложиться реально. Прежние 256
символов пусть будут выглядеть, как обычно, а на новых 256 как раз и
нужно рисовать. Площадь получается в два раза больше при таком подходе.
Я делал программу, которая рисует синусоиду и завершается. Можно было
даже в Norton Commander убрать и показать панели, синусоида остаётся.
В NC цвета преимущественно яркие, поэтому я менял цвет приглашения тоже
на яркий, а синусоиду рисовал на «тёмных» символах.
Если ещё и > 127 задействовать, то площадь в три(!) раза больше.
Здравствуйте, def0e0, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
D>Ух ты! То что надо! Можешь поделится библиотечкой?
Попытался раскопать. К сожалению, то, что я делал для С++, потерялось. Здесь я собрал все постарше, что делал с паскалевским Turbo Vision. Тем не менее, насколько я помню, каких либо специфических проблем с C++ версией не было. Эти исходники можно рассматривать скорее как прототип не очень высокого качества , но тем не менее что-то можно найти. Чтобы убедиться в работоспособности, можно запустить grabber\myshell.exe, предварительно разрешив ему использовать XMS память, и потом открыть, например, pcx\r.pcx. Идея простая, насколько я помню нужно перекрыть функцию отображения знакоместа, пересчет координат мыши и инициализацию/деинициализацию. Знакоместо в функции отображения знакоместа фактически определяется двухбайтовым словом, в нашей функции бит мерцания определяет, показывать ли обычный символ или делать расширенный "рендеринг" фрагмента. Переопределение бита мерцания — это единственная "несовместимость" с TV. Pасширенный "рендеринг" можно реализовывать по-разному, как вариант, отображать эти знакоместа на фрагменты загруженных в память битмапок. Одна деталь исполнения: у меня не было всех исходников TV для Паскаля, и я перекрывал функцию отображения знакоместа через 55h-е прерывание, хакнув tpu файл.
Вопросы are welcome
Здравствуйте, lxa, Вы писали:
lxa>Попытался раскопать. К сожалению, то, что я делал для С++, потерялось. Здесь я собрал все постарше, что делал с паскалевским Turbo Vision. Тем не менее, насколько я помню, каких либо специфических проблем с C++ версией не было. Эти исходники можно рассматривать скорее как прототип не очень высокого качества , но тем не менее что-то можно найти. Чтобы убедиться в работоспособности, можно запустить grabber\myshell.exe, предварительно разрешив ему использовать XMS память, и потом открыть, например, pcx\r.pcx. Идея простая, насколько я помню нужно перекрыть функцию отображения знакоместа, пересчет координат мыши и инициализацию/деинициализацию. Знакоместо в функции отображения знакоместа фактически определяется двухбайтовым словом, в нашей функции бит мерцания определяет, показывать ли обычный символ или делать расширенный "рендеринг" фрагмента. Переопределение бита мерцания — это единственная "несовместимость" с TV. Pасширенный "рендеринг" можно реализовывать по-разному, как вариант, отображать эти знакоместа на фрагменты загруженных в память битмапок. Одна деталь исполнения: у меня не было всех исходников TV для Паскаля, и я перекрывал функцию отображения знакоместа через 55h-е прерывание, хакнув tpu файл. lxa>Вопросы are welcome
Спасибо! Да уж... Разбираться видимо буду долго с этой темой...
Здравствуйте, def0e0, Вы писали:
D>Пишу программу под DOS на С++. В программе должны быть меню, окна, строка статуса и прочие удобства (например как в TurboPascal'е ), для этого использую библиотеку Turbo Vision. Проблема в том, что мне необходимо в одном из окон нарисовать график. Но как это сделать, если весь интерфейс рисуется в текстовом режиме символами? Как в текстовом режиме работать с отдельными пикселями? Или может есть какая-то библиотека с помощью которой можно создавать пользовательский интерфейс в графическом режиме?
у Фаронова во второй книжке по Паскалю рассматривается примерно такой же вопрос. Книжка называется "Turbo Pascal 7.0 Практика программирования"
Re: текстовый+графический режим в DOS?
От:
Аноним
Дата:
29.01.08 10:58
Оценка:
Здравствуйте, def0e0, Вы писали:
D>Пишу программу под DOS на С++. В программе должны быть меню, окна, строка статуса и прочие удобства (например как в TurboPascal'е ), для этого использую библиотеку Turbo Vision. Проблема в том, что мне необходимо в одном из окон нарисовать график. Но как это сделать, если весь интерфейс рисуется в текстовом режиме символами? Как в текстовом режиме работать с отдельными пикселями? Или может есть какая-то библиотека с помощью которой можно создавать пользовательский интерфейс в графическом режиме?
По-моему, Вы отстали от жизни лет так на 15...