Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Меню в С++ 3.1  (Прочитано 61422 раз)
0 Пользователей и 1 Гость смотрят эту тему.
elja_1989
Гость
« : 19-02-2008 17:36 » 

Народ, помогите с поиском инфы или с моим просвещением...
Задали курсач(1 курс), суть написать текстовый редактор, с реализацией системной части запаров особо нет, а вот с графикой и созданием меню я просто == 0

Скажите как сделать меню и панель со свитками.. Например File | Edit | BlaBla | BlaBla1 |
В инете на русском не нашёл ничего, может и плохо искал, но старался Ага
« Последнее редактирование: 19-02-2008 17:47 от elja_1989 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 19-02-2008 19:02 » 

elja_1989, На чем хоть пишем? Тема была перенесена с Unix C++. Если действительно в среде Linux. То можно ли использывать стороние библиотеки? Если да, то легче всего взять Qt и его использовать. Описание работы на английском можно найти на сайте разработчиков http://doc.trolltech.com/.
« Последнее редактирование: 19-02-2008 19:10 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sands
Помогающий

ua
Offline Offline

« Ответ #2 : 19-02-2008 20:06 » 

А если под ДОС,тогда прямой вывод в видеопамять очень даже рулит. Мы в свое время полностью скопировали вид редактора Turbo C со всеми его менюхами ))
Записан
elja_1989
Гость
« Ответ #3 : 20-02-2008 13:50 » 

Пишу на Borland C++ & Application Frameworks 3.1 под DOS..
Кста именно что-то похожее на Си с менюшками мне бы и хотелось, т.е. сверху панель с file edit ..., а снизу рабочая область... Писать надо именно в этой среде и под DOS.
« Последнее редактирование: 20-02-2008 13:53 от elja_1989 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 20-02-2008 13:56 » 

Насколько мне не изменяет память, у Борланда всегда в хелпе куча примеров была - практических. В тч и меню для текстового режима.

зы Кстати, оболочка графическая или текстовая?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sands
Помогающий

ua
Offline Offline

« Ответ #5 : 20-02-2008 14:08 » 

elja_1989
Ну тогда все очень просто.
Для етого нужны:
1) Желание поковыряться
2) Знание про работу напрямую с видеобуфером в тестовом режиме(по идее если поискать по форуму, то тема такая уже была)
3) Вспомогательная программа которая выведет по коду ASCII его символьное представление(пригодится когда будеш рамочки рисовать и все такое)
4) Хорошо продуманное взаиможействие с клавиатурой и мышью(если таковая предусматривается)
5) Много считать для того чтобы "подделка" не отличалась от "оригинала" в плане интерфейса ))

Основное тут первые 2 пункта. Как только возникнут вопросы по поводу 2 - пиши, бум разбираться ))

Джон, думаю если аналог Turbo С++ то все-таки текстовая
Записан
elja_1989
Гость
« Ответ #6 : 20-02-2008 16:26 » 

А кстати насчет графического и текстового режимов, что лучше выбирать для текстового редактора, просто я хочу под конец работы попытаться подключить мышь.. Её можно реализовать и там и там?

Ещё просьба, если можете скиньте сюда хоть какой пример кода выезжающего меню, типа жму че нить(например alt+f) и выезжает менюшка-свиток (без анимации конечно Улыбаюсь ), а в ней разные строки типа File Save As.. ну и т.д.
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #7 : 20-02-2008 16:26 » 

вообще там есть в библиотеках  TurboVision =) копируете оттуда функции один в один - и вуаля =)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 20-02-2008 17:24 » 

вообще там есть в библиотеках  TurboVision =) копируете оттуда функции один в один - и вуаля =)
В подавляющем большинстве вузов на 1-м курсе у студентов проблемы с ООП и, соответственно, использованием таких объектных библиотек, "дружелюбность" которых ниже, чем у Delphi. Это в моё время студенты младших курсов TV изучали просто ради интереса, вне программы. Теперь мне такие любознательные студенты попадаются исключительно редко Жаль.

elja_1989, в рамках какого курса выдано задание? Нужно использовать структурное или объектно-ориентированное программирование? Каково знание языка C (или C++)?
« Последнее редактирование: 20-02-2008 17:26 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #9 : 20-02-2008 17:57 » 

Я писал какой курс вначале(1 курс)
В рамках структурного
Borland C++ 3.1 можно юзать..
Учу язык 1 семестр, но успехи неплохие... Учусь быстро, трудолюбив и мне нравится  Улыбаюсь !

Я с графикой некогда не работал, ну не счетая моего хобби - 3dsmax, zbrush, vegas, photoshop и т.д., но к программухе это уж никак в данный момент прицепить нельзя!
В объектном я бы наверное бы не парился над меню(моё предположение), а вот в досовской сишке... Просто понятия не имею, как к этому подойти... Ну вот за сегодня за вчера дорубил как с графикой работать хоть немного, с тексовым режимом хоть чуток разобрался, но не рублю как в разбираться в вещах аля 0xb800. И нехочется просто тупо сдирать откуда-то код, ахочется разобраться, дорубить и уже делать с пониманием.

возникает вся таже просьба про меню...
« Последнее редактирование: 20-02-2008 18:10 от elja_1989 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 20-02-2008 18:07 » 

elja_1989, Ты чуть чуть не правильно понял Улыбаюсь. dimka, имел ввиду, какой именно предмет изучения, заставляет тебя писать такую программу.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
elja_1989
Гость
« Ответ #11 : 20-02-2008 18:12 » 

elja_1989, Ты чуть чуть не правильно понял Улыбаюсь. dimka, имел ввиду, какой именно предмет изучения, заставляет тебя писать такую программу.
В рамках курса ОАиЯП.. Основы алгоритмизации и языки программирования, простыми сломами - программирование Улыбаюсь
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 20-02-2008 19:58 » 

elja_1989, понятно. (Специальность, случаем, не 230105?)

Цитата: elja_1989
В объектном я бы наверное бы не парился над меню(моё предположение), а вот в досовской сишке...
По секрету скажу, что эта "досовская сишка..." тоже объектно-ориентированная Улыбаюсь Это значит, что под "объектным" ты понимаешь что-то не то.

Задача с меню простая, и читать там особо нечего. Нужно лишь думать "в правильную сторону".

1) В начале важно понимать такую тебе неведомую штуку, как поток управления. Сколько я понимаю, ты планируешь 2 режима работы: основные действия программы; работа с меню. Переключение в режим меню происходит по нажатию кнопки (например, F10), выход из меню по нажатию другой кнопки (например, Esc). При обычном подходе к структурному программированию эти режимы не могут работать одновременно, поскольку меню является вызываемой функцией - пока эта функция не завершит работу, нельзя будет вернуться к исходной функции. Добавление мыши потребует обязательного использования специфической "событийной" архитектуры, которая позволит создать видимость одновременной работы как меню, так и других функций программы. Если интересно, можем её разобрать. Если нет - тогда забудь про мышь. В конце ты её не приделаешь, если не заложишь правильный фундамент с самого начала.

2) Отделить функцию отрисовки текущего состояния меню (какой пункт меню выделен) от функции управления меню (как передвигать выделение между пунктами меню в случае нажатия соответствующих кнопок). Функция управления вызывает функцию отрисовки после изменения состояния меню.

3) Поскольку обе функции требуют информации о пунктах меню, то потребуется разработать структуру данных, которая описывают пункты меню, и может быть передана в каждую из функций..

4) Чтобы модуль обеспечения работы меню был удобно настраиваемым, полезно познакомиться с такой штукой, как указатели на функции, и научиться ими пользоваться.

P.S. Тему в "Начинающим".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #13 : 20-02-2008 20:07 » 

Если мне не изменяет память, то у С++ должны быть функции типа writebyte/readbyte в которых указывается, адрес в/из которого надо звписать/прочитать данные. Подробнее посмотри в справке Borland C++ 3.1
0хb000 ето адрес начала видеопамяти в текстовом режиме. На каждый символ екрана отводится 2 байта данных: байт самго символа и байт атрибутов(таких как цвет символа, цвет фона и мерцание).
Для того чтобы семулировать интерфейс Turbo C++ достаточно выставить первой строке атрибут фона в "белый", а строкам 2-80 поставить атрибут фона "синий". Изменять ети данные придется крайне редко, кроме тех случаев, когда некоторый участок будет перекрываться меню, и подсветки выделения текста (если она будет реализована)
Записан
elja_1989
Гость
« Ответ #14 : 20-02-2008 21:05 » 

Мммм... Ну в общем я более менее начал дорубать, указатели на функции я знаю неплохо... Вроде всё потдается логике.. Теперь возникают новые вопросы:
1) Если переключение в меню организовать через ALT+*! То напримериспользуя  switch, что писать в case? али 'ALT+F' он поймет, что-то подсказывает что нет)
2) Доступ к меню(к активной области скажем File) Осужествляется тупо по координатам? И "выделение на самом деле делается циклом, просто меняя цвет?
3) Как сделать скролирование текста(по нажатию стрелок) и переместить отображение, как бы под панель с File Edit Search

                File  Edit  Search                   (1;80)
                                                     
с координаты(2;161 до 2;238 идёт текст) Как его в рамки загнать?

4) Ещё, как я понял экран имеет всего 1 индекс из значений 25*80?   
5) Как передвигать с помщью индекса курсос мигающий, показывающий, где вводить текст...
« Последнее редактирование: 20-02-2008 21:08 от elja_1989 » Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #15 : 20-02-2008 21:28 » 

1) Нет такое ему будет сделать трудновато, можно отслеживать нажатие на "F" И в етот момент проверять нажата ли клавиша "Alt" - делается ето с помощью считывания статусного байта по адресу 0:0419
2) В случае с использованием мышки правильно, однако не стоит забывать про перемещене по меню с помощью стрелок "вправо" "влево", для етого удобней хранить индекс активного пункта меню(имхо). Опять же если реализовывать возможность перехода между меню когда один из пунктов, то стоит так же знать открыт етот пункт или нет.
3) А каким образом ты собираешся хранить весь набраный текст? И что обозначают индексы 2;161 2;238?
4) В видеопямяти - да, он линейный, но на более высшем уровне он имеет 25 строк по 80 символов, а потому для удобства работы лучше все же использовать координаты X(позиция в строчке 0..79) Y(номер строки 0..24)
5) По моему есть такая функция gotoxy(x,y) которая перемещает курсор в нужную позицию на екране (или за егопределами:-) ). Подробнее смотри Help.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 21-02-2008 12:36 » 

Ну вы, блин, даёте.

Во-первых, адрес B000 для монохромного режима, для цветного B800.

Во-вторых, зачем эти адреса и вручную писать прямой вывод в видеопамять, когда можно использовать имеющиеся в данной среде функции conio.h, где есть позиционирование курсора (gotoxy), управление цветами (textcolor, backgroundcolor), работа с окнами (включая их скроллирование)? Все эти функции как раз обеспечивают прямой вывод в видеопамять (по умолчанию), либо используют BIOS - переключение осуществляется значением специальной глобальной переменной (если память не изменяет, она называется directVideo или как-то так).

В-третьих, зачем статусный байт по адресу 0419 (и чтение 60-го порта)? Скорее, нужно уметь обрабатывать ASCII-коды нажатых клавиш (включая расширенные коды)? Не все сочетания клавишь можно будет охватить, но это и не главное в данной задаче.

В-четвёртых, структура видеопамяти текстового режима представляет собой 2-хбайтовое слово на позицию. 1-й байт описвает ASCII-код отображаемого символа, 2-й байт содержит цветовые атрибуты. Хотя, может и в другом порядке - точно не помню. Цветовые атрибуты описываются как: BGGGHCCC. C - биты цвета символа (8 цветов), H - бит яркости цвета символов (расширение до 16 цветов), G - биты цвета фона (8 цветов), B - (в зависимости от настроек) бит мерцания символов (8 цветов сохраняется) /яркости цвета фона (расширение до 16 цветов).

Цитата: elja_1989
Если переключение в меню организовать через ALT+*! То напримериспользуя  switch, что писать в case? али 'ALT+F' он поймет, что-то подсказывает что нет)
Нет, не поймёт. Нужно обрабатывать расширенный код данного сочетания клавиш. Коды можешь определить методом тыка - написать простую программку, которая читает все введённые символы и выводит на экран их коды (номера в таблице ASCII).

Главное даже не это, главное: где писать этот switch. В каком месте программы.

Цитата: elja_1989
Как его в рамки загнать?
Рамки рисуются символами псевдографики. Смотри кодовую таблицу 866 расширения ASCII.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 22-02-2008 14:00 » 

Я тут буду выкладывать различные решения, но на другом языке, чтобы показать идею, а не написать готовый для курсовика код.

Получение ASCII-кодов нажимаемых клавиш:
Код: (Text) Quick Basic
KeyCode% = 0
' Пока не нажата <Esc>
WHILE KeyCode% <> 27
        KeyCodes$ = INKEY$
       
        IF LEN(KeyCodes$) > 0 THEN
                KeyCode% = ASC(LEFT$(KeyCodes$, 1))
                IF KeyCode% = 0 THEN
                        ' Расширенный ASCII-код клавиши
                        KeyCode% = ASC(MID$(KeyCodes$, 2, 1))
                        PRINT 0, KeyCode%
                ELSE
                        ' Обычный ASCII-код клавиши
                        PRINT KeyCode%
                END IF
        END IF
WEND
END
В частности, столь желаемый <Alt>+<I> таким способом поймать можно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 22-02-2008 16:09 » 

Ну и собственно меню (только вертикальное, но с рамкой) для приложения с полноэкранными (не оконными) функциями может выглядеть примерно так:

Код: (Text) Quick Basic
DECLARE FUNCTION GetKeyCode% ()
DECLARE SUB Menu ()
DECLARE SUB Main ()
DECLARE SUB DrawMain ()
DECLARE SUB NewOperation ()
DECLARE SUB OpenOperation ()
DECLARE SUB SaveOperation ()
DECLARE SUB PrintOperation ()
DECLARE SUB ExitOperation ()
DECLARE SUB Stub (Name$)
DECLARE FUNCTION VerticalMenu% (X%, Y%, ItemNames$())
DECLARE SUB DrawVerticalMenu (StartX%, StartY%, ItemNames$(), CurrentItem%)

OPTION BASE 1
CALL Main
END

FUNCTION GetKeyCode%
        DO
                Keys$ = INKEY$
        LOOP UNTIL LEN(Keys$) <> 0
        KeyCode% = ASC(LEFT$(Keys$, 1))
        IF KeyCode% = 0 THEN
                GetKeyCode% = 255 * ASC(MID$(Keys$, 2, 1))
        ELSE
                GetKeyCode% = KeyCode%
        END IF
END FUNCTION

SUB Main
        DO
                CALL DrawMain
                SELECT CASE GetKeyCode%
                CASE 27
                        EXIT SUB
                CASE 17340
                        CALL Menu
                END SELECT
        LOOP
END SUB

SUB DrawMain
        CLS
        COLOR 7, 0
        LOCATE 12, 38
        PRINT "MAIN"
        LOCATE 25, 1
        PRINT "ESC=Exit  F10=Menu";
END SUB

SUB Menu
        DIM ItemNames$(5)
        ItemNames$(1) = "New"
        ItemNames$(2) = "Open"
        ItemNames$(3) = "Save"
        ItemNames$(4) = "Print"
        ItemNames$(5) = "Exit"
        SELECT CASE VerticalMenu%(10, 5, ItemNames$())
        CASE 1
                CALL NewOperation
        CASE 2
                CALL OpenOperation
        CASE 3
                CALL SaveOperation
        CASE 4
                CALL PrintOperation
        CASE 5
                CALL ExitOperation
        END SELECT
END SUB

FUNCTION VerticalMenu% (X%, Y%, ItemNames$())
        CurrentItem% = LBOUND(ItemNames$)
        DO
                CALL DrawVerticalMenu(X%, Y%, ItemNames$(), CurrentItem%)
                SELECT CASE GetKeyCode%
                CASE 13
                        VerticalMenu% = CurrentItem%
                        EXIT FUNCTION
                CASE 27
                        VerticalMenu% = -1
                        EXIT FUNCTION
                CASE 18360
                        IF CurrentItem% > LBOUND(ItemNames$) THEN
                                CurrentItem% = CurrentItem% - 1
                        END IF
                CASE 20400
                        IF CurrentItem% < UBOUND(ItemNames$) THEN
                                CurrentItem% = CurrentItem% + 1
                        END IF
                END SELECT
        LOOP
END FUNCTION

SUB DrawVerticalMenu (StartX%, StartY%, ItemNames$(), CurrentItem%)
        MaxLengthOfName% = 0
        FOR I% = LBOUND(ItemNames$) TO UBOUND(ItemNames$)
                LengthOfName% = LEN(ItemNames$(I%))
                IF MaxLengthOfName% < LengthOfName% THEN
                        MaxLengthOfName% = LengthOfName%
                END IF
        NEXT I%
        Y% = StartY%
        COLOR 15, 0
        LOCATE Y%, StartX%
        PRINT CHR$(218);
        FOR X% = StartX% + 1 TO StartX% + MaxLengthOfName% + 2
                LOCATE Y%, X%
                PRINT CHR$(196);
        NEXT X%
        LOCATE Y%, StartX% + MaxLengthOfName% + 3
        PRINT CHR$(191);      
        FOR I% = LBOUND(ItemNames$) TO UBOUND(ItemNames$)
                Y% = Y% + 1
                LOCATE Y%, StartX%
                PRINT CHR$(179);
                IF I% = CurrentItem% THEN
                        COLOR 0, 3
                ELSE
                        COLOR 0, 7
                END IF
                LOCATE Y%, StartX% + 1
                PRINT " ";
                LOCATE Y%, StartX% + 2
                PRINT ItemNames$(I%);
                LengthOfName% = LEN(ItemNames$(I%))
                FOR J% = LengthOfName% TO MaxLengthOfName% + 1
                        X% = StartX% + J% + 2
                        LOCATE Y%, X%
                        PRINT " ";
                NEXT J%
                COLOR 15, 0
                LOCATE Y%, StartX% + MaxLengthOfName% + 3
                PRINT CHR$(179);
        NEXT I%
        Y% = Y% + 1
        LOCATE Y%, StartX%
        PRINT CHR$(192);
        FOR X% = StartX% + 1 TO StartX% + MaxLengthOfName% + 2
                LOCATE Y%, X%
                PRINT CHR$(196);
        NEXT X%
        LOCATE Y%, StartX% + MaxLengthOfName% + 3
        PRINT CHR$(217);
        COLOR 7, 0
        LOCATE 25, 1
        PRINT "ESC=Cancel  ENTER=Execute  ARROW UP,ARROW DOWN=Select";
END SUB

SUB ExitOperation
        CALL Stub("EXIT")
END SUB

SUB NewOperation
        CALL Stub("NEW")
END SUB

SUB OpenOperation
        CALL Stub("OPEN")
END SUB

SUB PrintOperation
        CALL Stub("PRINT")
END SUB

SUB SaveOperation
        CALL Stub("SAVE")
END SUB

SUB Stub (Name$)
        COLOR 7, 0
        CLS
        LOCATE 12, 40 - LEN(Name$) / 2
        PRINT Name$;
        LOCATE 25, 1
        PRINT "Press any key";
        DO
        LOOP UNTIL INKEY$ <> ""
END SUB

Тут ещё надо много чего доводить до кондиции, например, обрабатывать нештатные ситуации, когда меню не помещается на экране и т.д.
« Последнее редактирование: 22-02-2008 20:36 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #19 : 22-02-2008 18:15 » 

dimka, Нащет памяти - каюсь не то написал, относительно Альта - согласен, что предложил не самое оптимальное решение( я просто не пробовал через ASCII делать, а когда появилась надобность обрабатывать Альт, то как раз еще свежими были зхнания про нужные адреса в памяти, да и код готовый был, потому его и использовал)

А меню и все остальное рисовал напрямую... К счастью или к сожалению - трудно сказать...
Записан
elja_1989
Гость
« Ответ #20 : 22-02-2008 21:30 » 

Мммм.. С меню вроде уже разберусь, а вот как организовать редактирование и выделение текста.. Каждую строку на которой каретка в данных момент, да или каждую хранить в отдельном буфере для строки?
Записан
Sands
Помогающий

ua
Offline Offline

« Ответ #21 : 22-02-2008 22:09 » 

elja_1989,  хм... Вот представь себе что ты работал(а) С Word-ом. Какие там возможности для редактирования текста существуют? Ты сначала опиши чего тебе хочется, и как ты ето видиш, а потом жди помощи и конструктивной критики...
Записан
elja_1989
Гость
« Ответ #22 : 23-02-2008 22:39 » 

Код: (C)
//#include <graphics.h>
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>

void del(char**,int,int,int);

void main()
{clrscr();
 int i,j,k,x=1,y=1;
 char **ms;
 int n=25;
 ms=(char**)calloc(n,sizeof(char*));
 for(i=0;i<n;i++)
 { *(ms+i)=(char*)calloc(80,sizeof(char));
   *(ms+i)="kd adasdddddddddddddddddddd adada a dadadasd kldskl sklslk sdklsdlk ssdfsklsdf";
   puts(*(ms+i));
 }

 gotoxy(1,1);

 while(1)
 {
    switch(getch())
  {
    case 72:
              y--;
              if(y<1) y=1;
              gotoxy(x,y);
              break;

    case 80:
              y++;
              if(y>25) y=1;
              gotoxy(x,y);
              break;

    case 77:
              x++;
              if(x>80) {x=1;y++;}
              gotoxy(x,y);
              break;

    case 75:
              x--;
              if(x<1) {x=80; if(!(y<=1)) y--;}
              gotoxy(x,y);
              break;


    case 8:
               del(ms,x,y,n);
               break;


  }
 }
}


void del(char **ms,int x,int y,int n)
{
 for(i=x-1;i<80;i++)
   *(*(ms+y-1)+i-1)=*(*(ms+y-1)+i);

 clrscr();

 for(i=0;i<n;i++)
   cputs(*(ms+i));

 gotoxy(--x,y);

}

Ну вот что-то тока что набросал тестовое, впадлу уже сегодня править что-то! Что-то тут работает, 1 строка кое как, но не суть.. мне то про подход спросить хотелось, учтите тока что всякие мелочевые ошибки я не отрабатывал(аля сдвиги куда не надо, перенос с другой строки..) Да и не в состояние провить, праздник всё таки был)) Жду критики короче.. правильный подход беру или нет.. Кстати упорно дрочился над выводом новым.. Какова-то не хотел работать принтф, работал тока цпринтф..
« Последнее редактирование: 06-08-2008 16:34 от Алексей1153++ » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 24-02-2008 07:24 » 

Обработка расширенных кодов неправильная. В таком виде кнопки движения курсора совпадают с буквами латинского алфавита.

Цитата: elja_1989
Какова-то не хотел работать принтф, работал тока цпринтф..
При подключении conio.h нужно использовать cprintf. Стандартные потоки ввода/вывода заменяются на прямую работу с видеопамятью.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
elja_1989
Гость
« Ответ #24 : 24-02-2008 07:33 » 

Ммм.. Так я и подозревал.. А как сделать, через порты(0х417) получается? Или есть ещё АЦКИЙ КОД этих..
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 24-02-2008 09:23 » 

elja_1989, зачем тебе порты? Пример более правильной обработки расширенных кодов см. выше.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sands
Помогающий

ua
Offline Offline

« Ответ #26 : 24-02-2008 11:07 » 

elja_1989, Если тебе на вход будет приходить расширенный код, то он будет состоять как бы из 2 "символов", первый из которых 0, а второй -  какое-то значение.(именно ето написано в том примере кода от dimka) Соответственно для корректрой обработки расширенных кодов надо проверять значение считанного символа на 0.
Записан
elja_1989
Гость
« Ответ #27 : 24-02-2008 12:50 » 

То что у него там мне неочем не говорит, я никогда раньше не программил, я занимался 3д графикой..
Не могли бы вы показать как это сделать..
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 24-02-2008 13:45 » 

Цитата: elja_1989
То что у него там мне неочем не говорит, я никогда раньше не программил, я занимался 3д графикой..
Ну и что? Программист понимает почти любой (за исключением всяких извращений типа BrainFuck) алгоритмический язык программирования - даже незнакомый, так как все они основаны на едином принципе. Посмотри внимательно на код Quick Basic и подумай.

Цитата: elja_1989
Не могли бы вы показать как это сделать..
Там это и показано - там приведён рабочий код. Кроме того, уже на словах даны пояснения основного принципа.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 24-02-2008 14:11 » 

elja_1989, придется учить - готовую программу писать за тебя никто не будет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines