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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
__Dim__
0 / 0 / 0
Регистрация: 25.06.2009
Сообщений: 18
#1

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

28.01.2011, 11:08. Просмотров 1779. Ответов 11
Метки нет (Все метки)

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

Аналог меню. Вызов подпрограмм - C++
Задали тут сделать обобщающую программку,где все лабы запускаются из меню по выбору.После того как какая-нибудь программа выполнена она...

Движение в консоле - C++
подскажите как реализовать движение в консоле, мне нужна игра гоночки типа тетриса!

Позиционирование в консоле - C++
Добрый вечер госопда, есть фрагмент кода: #include <iostream> #include <stdlib.h> #include <time.h> #include...

Color в консоле - C++
Где ошибка? #include <iostream> #include <conio.h> using namespace std; int main(){ clsscr; textbackground(GREEN); ...

Русские буквы в консоле - C++
Привет. Совсем недавно начал изучать C++ и тут такое дело... //Заменить все точки в строке восклицательным знаком... ...

Выводит кракозыбры в консоле - C++
#include "stdafx.h" #include "iostream" #include <time.h> #include <string> #include <iomanip> #include <cstdlib> #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
@KOT@
81 / 39 / 2
Регистрация: 29.01.2010
Сообщений: 386
28.01.2011, 14:16 #2
Хм... даже не знаю возможно ли это. Во всяком случае не видел, чтобы у кого - то это получилось.

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

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

Добавлено через 2 минуты
Нашел, нужно прерывание 33h, т.е. 51-ое ))
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.01.2011, 19:59 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
а что TURBO C++ позволяет с досовскими прерываниями работать?
да там даже несколько функций для работы с ними и структура с регистрами)
Цитата Сообщение от Kastaneda Посмотреть сообщение
А в 33 прерывании (int 21h) нет средств для работы с мышью,
для мышки 33-е прерывание int 33h
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 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 — выполнен двойной щелчок мыши.

0
Iron Bug
22 / 22 / 0
Регистрация: 06.12.2010
Сообщений: 125
28.01.2011, 20:35 #11
вряд ли тут требуется именно графическая менюшка. а время в верхней строке - это вообще даром: таймер и gotoxy. и обычная печать.
0
__Dim__
0 / 0 / 0
Регистрация: 25.06.2009
Сообщений: 18
31.01.2011, 10:50  [ТС] #12
Привет всем
Спасибо большое за предоставленную инфу

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

ОС - Линуха, ДОС. Есть табло сигнализации 4 строки. В своей проге я должен имитировать эти 4 строки, а затем по RSу отображать их в этом табло. Первая строчка - дата и время,должна постоянно отображаться, две следующие - информационные(e.g. мигать в случаи аварии) и последняя - меню. Выбор происходит стрелками.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2011, 10:50
Привет! Вот еще темы с ответами:

GCC, кириллица в консоле - C++
Есть код на языке C++. Я его компилирую в win7 через cmd с помощью команды g++. Компилятор установлен с помощью MiniGW. После компиляции...

C++. Ввод, вывод (в консоле) - C++
Помогите, пожалуйста... Только начал учить С++ а) Напишите программу, которая выводит на экран разным цветом контуры треугольника,...

Украинские шрифты в консоле - C++
Тема аналог Русские шрифты в консоле Токо что делать если мне надо Укр. setlocale (LC_ALL, ""); решает проблему с Рус. шрифтом но вот...

Время звука в консоле - C++
Здравствуйте! Подскажите как сделать продолжительность звука "\a"? (например, чтобы звучал непрерывно 3 секунды).


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.01.2011, 10:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru