Рисование диалогов в Си

Модератор: Модераторы разделов

skvitek
Сообщения: 96

Рисование диалогов в Си

Сообщение skvitek »

Здравствуйте!
Есть у нас в универе предмет - программирование. Программируем мы только на Паскале, а я вот захотел начать изучать Си. Мы с преподавателем договорились, что по мере возможности я буду делать лабы на Си, ну а то что не смогу - на Паскале, сдавать-то лабы нужно. И вот сразу столкнулся с проблемой(повторяю, я новичок) - в лабораторной нужно рисовать диалоги. На Паскале мы это делаем с помощью модуля CRT(см код), а вот как это сделать на Си я не знаю. Есть у меня книга Дейтелов(на 900 стр такой учебник), читаю её, но ничего похожего на наши лабы не нашёл.
Скажите, есть ли некоторое подобие модуля CRT, но в Си, или можно выкрутиться по-другому.

Код: Выделить всё

{...}
{Цвет текста и фона}
procedure colors(cv1, cv2 : byte);
          begin
               TextColor(cv1);
               TextBackground(cv2);
          end;

{Тень у диалога - для красоты}
procedure shadow(x1, y1, x2, y2, cv1, cv2 : byte);

          var
             i:byte;
          begin
               colors(cv1, cv2);
               for i:=y1 to y2 do
               begin
                    GotoXY(x1, i);
                    write(' ' :x2-x1+1);
               end;
          end;

{Двойная псевдографическая рамка}
procedure double(x1, y1, x2, y2, cv1, cv2 : byte);
          const
                s1 = #201;
                s2 = #205;
                    s3 = #187;
                s4 = #186;
                s5 = #200;
                s6 = #188;
          var
                i : byte;
          begin
               shadow(x1+1, y1+1, x2+1, y2+1, 0, 0);
               shadow(x1, y1, x2, y2, cv1, cv2);
               GotoXY(x1, y1);
               write(s1);
               for i:=x1+1 to x2-1 do

                       write(s2);
               write(s3);
               for i:=y1+1 to y2-1 do begin
                    gotoxy(x1, i);
                    write(s4);
                    gotoxy(x2, i);
                    write(s4);
               end;
               gotoxy(x1, y2);
               write(s5);
               for i:=x1+1 to x2-1 do
                       write(s2);
               write(s6);
          end;


begin
     colors(11, 1);
     clrscr;
{...}
{Вот так дилог выглядит в сборе}
     double(20, 6, 60, 16, 14, 5);
     gotoxy(29, 6);
     write('Вычисляем синус');
     gotoxy(30, 9);
     write('Результат: ');
     gotoxy(32, 11);
     write('Аргумент = ', a:8:5);
     gotoxy(32, 13);
     write('Синус = ', f:8:5);

     readln;

end.
nyashka
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Рисование диалогов в Си

Сообщение bormant »

Необходимо уточнить, о C с какой библиотекой идет речь, под чем оно должно работать. Если предположить эквивалентные условия (dos, tc2.01 или tcpp1.01, которые борландом выложены бесплатно в музее), то примерно так:

Код: Выделить всё

#include <conio.h>
/*...*/
typedef unsigned char byte;
/*или #define byte unsigned char
уже не помню, было ли оно в tc2.01*/

/*Цвет текста и фона*/
void colors(unsigned char cv1, unsigned char cv2) {
    textcolor(cv1 | (cv2<<4));
}

/*Тень у диалога для красоты*/
void shadow(byte x1, byte y1, byte x2, byte y2, byte cv1, byte cv2) {
    unsigned char i, int j;
    colors(cv1, cv2);
    for(i=y1; i<=y2; i++) {
        gotoxy(x1, i);
        /* тут лучше cprintf, но не помню точно спецификации формата, потому то, что есть */
        for(j=x2-x1+1; j>0; j--) putch(' ');
    }
}

/*Двойная псевдографическая рамка*/
#define s1 = 201
#define s2 = 205
#define s3 = 187
#define s4 = 186
#define s5 = 200
#define s6 = 188

void double(byte x1, byte y1, byte x2, byte y2, byte cv1, byte cv2) {
    byte i;
    shadow(x1+1, y1+1, x2+1, y2+1, 0, 0);
    shadow(x1, y1, x2, y2, cv1, cv2);
    gotoxy(x1, y1);
    putch(s1);
    for(i=x1+1; i<=x2-1; i++)
        putch(s2);
    putch(s3);
    for(i=y1+1; i<=y2-1; i++) {
        gotoxy(x1, i);
        putch(s4);
        gotoxy(x2, i);
        putch(s4);
    }
    gotoxy(x1, y2);
    putch(s5);
    for(i=x1+1; i<=x2-1; i++)
        putch(s2);
    putch(s6);
end;

void main() {
    colors(11, 1);
    clrscr();
    /*...*/
    /*Вот так дилог выглядит в сборе*/
    double(20, 6, 60, 16, 14, 5);
    gotoxy(29, 6);
    cprintf("Вычисляем синус");
    gotoxy(30, 9);
    cprintf("Результат: ");
    gotoxy(32, 11);
    cprintf("Аргумент = %8.5f", a);
    gotoxy(32, 13);
    cprintf("Синус = %8.5f", f);
    getch();
}

Как говорится, найдите n отличий ;)
Спасибо сказали:
skvitek
Сообщения: 96

Re: Рисование диалогов в Си

Сообщение skvitek »

Ясно, спасибо!
Найду ещё книгу и по ТурбоСи(если не ошибаюсь, то именно так должно расшифровываться tc2.01?)/
nyashka
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Рисование диалогов в Си

Сообщение Portnov »

А оно вам надо - изучать доисторический язык под доисторическую операционку? Раз уж хочется изучать C - изучайте его в современном виде. В качестве замены паскалевскому crt лучше взять кроссплатформенную библиотеку ncurses.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Рисование диалогов в Си

Сообщение Denjs »

Соглашусь с Portnov, но посоветую освоить QT. Рисовать диалоги на нем - самое то. )
Если конечно понимаете что такое ООП.
(хотя вам все равно _придется_ начать это понимать если вы собираетесь изучать программирование дальше...
а судя по настрою топика вы в этом заинтересованы...)
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Рисование диалогов в Си

Сообщение Olegator »

учите Qt, в продаже есть книга Макса Шлее по Qt, ну и конечно же ни что не сравнится с QtAssistant
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Рисование диалогов в Си

Сообщение bormant »

skvitek,
основная идея моего предыдущего поста -- показать, что зависит от языка, а что от библиотек и среды исполнения. Чем ближе среда исполнения -- тем меньше будет отличий для случая перевода паскаль->си. И наоборот, если писать для QT, то языковые отличия будут только в вычислительной части, а все прочие различия (основные) будут вызваны требованиями библиотек/среды исполнения.
Да, нужно понимать, что С подмножество С++, но это разные языки.
Спасибо сказали:
skvitek
Сообщения: 96

Re: Рисование диалогов в Си

Сообщение skvitek »

Что ж, спасибо всем за сответы, будет над чем подумать.
Наверняка первые несколько лаб буду делать на ТурбоСи, чтобы отвыкнуть немного от паскаля(да и нужно их быстро написать), а потом уже попробую написать на современном варианте. Возможно перейду и к Qt.
Ещё раз всем спасибо!
nyashka
Спасибо сказали:
skvitek
Сообщения: 96

Re: Рисование диалогов в Си

Сообщение skvitek »

Я уже подумал(взглянув на tc2.01). Не подскажите, где можно найти документацию по использованию ncurses?
Притом повторюсь, я очень начинающий.
nyashka
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Рисование диалогов в Си

Сообщение Portnov »

Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали: