Форум программистов, компьютерный форум CyberForum.ru

Аналог меню в консоле - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
__Dim__
0 / 0 / 0
Регистрация: 25.06.2009
Сообщений: 18
28.01.2011, 11:08     Аналог меню в консоле #1
Привет всем
Обращаюсь к Вам за помощью Помогите, плиз, разобраться с задачкой.
Мне надо сделать аналог менюшки в консоле - верхняя строка должна показывать строку с текущим временем(час,мин,сек). Как реализовать что-то подобное на mainloop Windы в консоле
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2011, 11:08     Аналог меню в консоле
Посмотрите здесь:

матрица в консоле C++
C++ Движение в консоле
Color в консоле C++
2программы в консоле. C++
C++ Украинский шрифт в консоле
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
28.01.2011, 14:16     Аналог меню в консоле #2
Хм... даже не знаю возможно ли это. Во всяком случае не видел, чтобы у кого - то это получилось.

Ты уверен, что это выполнимо?
Mogul-kan
23 / 23 / 2
Регистрация: 24.04.2010
Сообщений: 220
28.01.2011, 15:02     Аналог меню в консоле #3
нечто похожее на меню можно сделать оператором switch. Типо выбирай вариант и программа выполнит то что нужно
XLBaron
 Аватар для XLBaron
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 26
28.01.2011, 15:21     Аналог меню в консоле #4
Цитата Сообщение от Mogul-kan Посмотреть сообщение
нечто похожее на меню можно сделать оператором switch. Типо выбирай вариант и программа выполнит то что нужно
да мы делали такое когда или Case юзай и разную ерунду для отрисовки типо Lineto
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
28.01.2011, 15:22     Аналог меню в консоле #5
Цитата Сообщение от Mogul-kan Посмотреть сообщение
нечто похожее на меню можно сделать оператором switch. Типо выбирай вариант и программа выполнит то что нужно
Я так понял, что автор имеет ввиду настоящее меню, как в гуи программах или программе типа турбо паскаля. Но насколько я знаю в консоле невозможно обрабатывать нажатия мышкой, или я не прав?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.01.2011, 15:45     Аналог меню в консоле #6
Цитата Сообщение от @KOT@ Посмотреть сообщение
Но насколько я знаю в консоле невозможно обрабатывать нажатия мышкой, или я не прав?
не прав) если писать под Турбо С++ 3.0 то с помощью 33-го прерывания можно работать с мышкой
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
28.01.2011, 16:06     Аналог меню в консоле #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
не прав) если писать под Турбо С++ 3.0 то с помощью 33-го прерывания можно работать с мышкой
О, не знал, спасибо)) буду знать на будущее!!!
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.01.2011, 19:57     Аналог меню в консоле #8
А зачем Turbo C++? Есть API'лки, позволяющие работать с манипулятором "мышь" в консоли, так же есть ф-ции для "украшения" консольного окна, если захотеть, то можно реализовать меню типа как в GUI. Я когда-то на АСМе такое делал, через те же WinAPI)

Добавлено через 4 минуты
Maxwe11, а что TURBO C++ позволяет с досовскими прерываниями работать? Просто я в нем ни когда не работал, не знаю...
А в 33 прерывании (int 21h) нет средств для работы с мышью, тут другое прерывание нужно, не помню какое...

Добавлено через 2 минуты
Нашел, нужно прерывание 33h, т.е. 51-ое ))
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.01.2011, 19:59     Аналог меню в консоле #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
а что TURBO C++ позволяет с досовскими прерываниями работать?
да там даже несколько функций для работы с ними и структура с регистрами)
Цитата Сообщение от Kastaneda Посмотреть сообщение
А в 33 прерывании (int 21h) нет средств для работы с мышью,
для мышки 33-е прерывание int 33h
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.01.2011, 20:12     Аналог меню в консоле #10

Не по теме:

33hex = 51dec )



Добавлено через 9 минут
Работы с мышью в консоли
Большое достоинство консольных приложений — встроенная средствами Windows поддержка мыши. Она реализуется с помощью функции ReadConsolelnput. Важно отметить, что эта функция используется для получения информация о событиях не только мыши, но и о событиях клавиатуры, изменении размера окна и т. д.

B00L ReadConsoleInput(HANDLE hConsolelnput. PINPUT_RECORD lpBuffer, DWORD nLength. LPDWORD lpNumberOfEventsRead);

Параметры этой функции:
Consolelnput — стандартный дескриптор ввода, полученный функцией GetStdHandle;
lpBuffer — указатель на буфер, в который записывается информация о событии мыши, — эта область памяти имеет структуру, называемую INPUT_ RECORD, ее формат рассмотрен чуть ниже (необходимо заметить, что возможно групповое чтение информации из входного буфера, поэтому указатель ipBuffer может указывать на массив структур; информация о том, сколько событий будет читаться в этот массив структур, определяется параметром nLength);
nLength — размер во входных записях буфера, на который указывает указатель lpBuffer;
lpNumberOfEventsRead — определяет переменную, в которую записывается
действительное число прочитанных записей входного буфера.

Запись входного буфера консоли имеет структуру, называемую INPUTRECORD. Ее описание на языке C++ выглядит так:

typedef struct _INPUT_RECORD { WORD EventType; union {
KEYJVENT_RECORD KeyEvent;
MOUSE_EVENT_RECORD MouseEvent;
WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
MENU_EVENT_RECORD MenuEvent:
FOCUSJVENT_RECORD FocusEvent;
} Event: } INPUT_RECORD;

В этой структуре первое поле EventType размером в слово содержит тип события, а второе поле Event является объединением различных структур. Поля какой из структур будут заполнены, определяется типом события, то есть первым полем, которое может принимать значения:
KEY_EVENT=0001h - поле Event содержит структуру KEYEVENTRECORD с информацией относительно события клавиатуры;
MOUSE_EVENT=0002h — ноле Event содержит структуру
MOUSEEVENTRECORD с информацией относительно движения мыши или нажатия кнопки;
WINDOW_BUFFER_SIZE_EVENT-O004h - поле Event содержит структуру
WINDOW_ BUFFER_SIZE_RECORD с информацией относительно нового размера экранного буфера;
MENU_EVENT=OOO8h — поле Event содержит структуру MENUEVENTRECORD (это событие используется внутри Windows и должно игнорироваться);
FOCUS_EVENT=0010h - поле Event содержит структуру FOCUSEVENTRECORD (это
событие используется внутри Windows и должно игнорироваться).

Для обработки события мыши структура MOUSEEVENTRECORD выглядит так:

typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState:
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;

Исходя из вышесказанного структура INPUTRECORD для обработки событий мыши в программе на ассемблере должна выглядеть так:
INPUT_RECORD struc EventType dw 0 dwMousePosition struc x dw 0 у dw 0 ends
dwButtonState dw 0 dwControlKeyState dw 0 DwEventFlags dw 0 ends
Поле EventType для события мыши содержит значение MOUSE_EVENT=0002h, а поля структуры MOUSEEVENTRECORD соответственно означают следующее:
ш dwMousePosition — координаты мыши в окне консоли (в символьных координатах);
м dwButtonState — состояние кнопок мыши в момент возникновения события, при нажатии кнопок устанавливаются следующие биты (при одновременном нажатии устанавливается несколько соответствующих битов):
если установлен бит 0 ноля dwButtonState, то в момент наступления события была нажата левая кнопка мыши;
если установлен бит 1 поля dwButtonState, то в момент наступления события была нажата правая кнопка мыши;
если установлен бит 2 поля dwButtonState, то в момент наступления события была нажата средняя кнопка мыши, если она есть;
dwControlKeyState — поле описывает состояние управляющих клавиш клавиатуры в момент наступления события мыши (если одновременно нажато несколько клавиш, то значение в этом поле является результатом операции логического сложения ИЛИ перечисленных ниже значений):
• RIGHT_ALT_PRESSED=0001h - нажата правая клавиша Alt;
• LEFT_ALT_PRESSED=0002h - нажата левая клавиша Alt;
• RIGHT_CTRL_PRESSED=0004h — нажата правая клавиша
Ctrl; LEFT_CTRL_PRESSED=OOO8h — нажата левая клавиша Ctrl;
• SHIFT_PRESSED=OOlOh - нажата любая клавиша SHIFT;
• NUMLOCK_ON=0020h - индикатор NumLock включен;
• SCROLLLOCK_ON=0040h — индикатор ScrollLock включен;
• CAPSLOCK_ON=0080h — индикатор CapsLock включен;
ENHANCED_KEY=0100h — нажата клавиша расширенной клавиатуры (101 и 102 клавиши): Ins, Del, Home, End, Page Up, Page Down, «-, t, -», I, / или Enter;
Ш dwEventFl ags — поле содержит одно из двух значений: »
MOUSE_MOVED=0001h — перемещение мыши;
• DOUBLE_CLICK=0002h — выполнен двойной щелчок мыши.

Iron Bug
22 / 22 / 0
Регистрация: 06.12.2010
Сообщений: 125
28.01.2011, 20:35     Аналог меню в консоле #11
вряд ли тут требуется именно графическая менюшка. а время в верхней строке - это вообще даром: таймер и gotoxy. и обычная печать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2011, 10:50     Аналог меню в консоле
Еще ссылки по теме:

C++ Аналог меню. Вызов подпрограмм
Позиционирование в консоле C++
Время звука в консоле C++

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

Или воспользуйтесь поиском по форуму:
__Dim__
0 / 0 / 0
Регистрация: 25.06.2009
Сообщений: 18
31.01.2011, 10:50  [ТС]     Аналог меню в консоле #12
Привет всем
Спасибо большое за предоставленную инфу

Прошу прощения, что не четко выразил суть своей проблемы (сам толком не понимал).

ОС - Линуха, ДОС. Есть табло сигнализации 4 строки. В своей проге я должен имитировать эти 4 строки, а затем по RSу отображать их в этом табло. Первая строчка - дата и время,должна постоянно отображаться, две следующие - информационные(e.g. мигать в случаи аварии) и последняя - меню. Выбор происходит стрелками.
Yandex
Объявления
31.01.2011, 10:50     Аналог меню в консоле
Ответ Создать тему
Опции темы

Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru