Помощ - Търси - Регистрирани - Календар
Пълна версия: Меню в С/С++
UniBG Forums > Дискусии > Dexter's Lab > Програмиране
GUEST
CODE
Здравейте!
Как да си направя меню, от типа натисната стрелка надолу и срещу 2. от менюто да се появява стрелка. Провах да проверя за ASCII, стойността на стрелка надолу и ако тя е натисната да се визуализира промяна в началното меню, но неуспешно.
int21h
QUOTE(GUEST @ Jul 15 2007, 11:00 PM) *
CODE
Здравейте!
Как да си направя меню, от типа натисната стрелка надолу и срещу 2. от менюто да се появява стрелка. Провах да проверя за ASCII, стойността на стрелка надолу и ако тя е натисната да се визуализира промяна в началното меню, но неуспешно.


Нещо такова?

CODE
    MENU
  ► 1. Item1
    2. Item2
    3. Item3
    4. Item4
    5. Quit


ESC - Quit


Btw, за каква операционна система? :)
guesta
Да, точно! А ОС м DOS under Windows.
int21h
QUOTE(guesta @ Jul 31 2007, 01:09 AM) *
Да, точно! А ОС м DOS under Windows.


Би трябвало да се компилира дори на Borland C++ 3.1

CODE
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define KEY_ESCAPE   283
#define KEY_UP     18432
#define KEY_DOWN   20480
#define KEY_ENTER   7181
#define MENU_POSITIONS 5
#define ARROW_CHAR    16

int KeyPressed;

char NewMenuPosition = 0,
     OldMenuPosition = 0,
     QuitMenu        = 0;

void DrawMenu();
void DrawMenuPositions();
void Actions();
void Quit();

void main()
{
_setcursortype( _NOCURSOR );
DrawMenu();
DrawMenuPositions();

while( !QuitMenu )
{

  KeyPressed = bioskey( 0 );

  OldMenuPosition = NewMenuPosition;

  switch( KeyPressed )
  {
   case KEY_UP    : NewMenuPosition--;
                    break;

   case KEY_DOWN  : NewMenuPosition++;
                    break;

   case KEY_ESCAPE: Quit();

   case KEY_ENTER : Actions();
  }

  if( NewMenuPosition < 0 )
   NewMenuPosition = MENU_POSITIONS + NewMenuPosition;

  if( NewMenuPosition >= MENU_POSITIONS )
   NewMenuPosition-= MENU_POSITIONS;

  if( NewMenuPosition != OldMenuPosition )
   DrawMenuPositions();
}

Quit();

}
    

void DrawMenu()
{
clrscr();
printf( "    MENU\n"
         "   1. Item1\n"
         "   2. Item2\n"
         "   3. Item3\n"
         "   4. Item4\n"
         "   5. Quit\n\n\n"
         " ESC - Quit" );
}

void DrawMenuPositions()
{
gotoxy( 2, OldMenuPosition + 2);
printf( "%c", 32 ); //space
gotoxy( 2, NewMenuPosition + 2);
printf( "%c", ARROW_CHAR );
}

void Actions()
{
switch( NewMenuPosition )
{
  case 0 : // enter pressed on item1
           break;

  case 1 : // enter pressed on item2
           break;

  case 2 : // enter pressed on item3
           break;

  case 3 : // enter pressed on item4
           break;

  case 4 : // enter pressed on item5
           QuitMenu = 1;
}
}

void Quit()
{    
_setcursortype( _NORMALCURSOR );
gotoxy( 1, 24 );
exit( 1 );
}
guesta
Благодаря, обече на BorlandCpp 5.02 изкарва грешка при
CODE
KeyPressed = bioskey(0);
int21h
Пропуснал си първия ред от кода.

CODE
#include <bios.h>
..


Затова ти връща грешка:
QUOTE
Error menu.cpp 32: Call to undefined function 'bioskey' in function main()
Гост
Не, там си е и пак резултатът е същия...
int21h
QUOTE(Гост @ Jul 31 2007, 06:43 PM) *
Не, там си е и пак резултатът е същия...


Много странно.. Не вярвам в 5.02 да липсва bioskey-а, при условие, че го има в 5.0
Както и да е.. Ето кода с getch() вместо bioskey:

CODE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define KEY_ESCAPE    27
#define KEY_UP        72
#define KEY_DOWN      80
#define KEY_ENTER     13
#define MENU_POSITIONS 5
#define ARROW_CHAR    16

char KeyPressed      = 0,
     NewMenuPosition = 0,
     OldMenuPosition = 0,
     QuitMenu        = 0;

void DrawMenu();
void DrawMenuPositions();
void Actions();
void Quit();

void main()
{
_setcursortype( _NOCURSOR );
DrawMenu();
DrawMenuPositions();

while( !QuitMenu )
{

  KeyPressed = getch();

  OldMenuPosition = NewMenuPosition;

  switch( KeyPressed )
  {
   case KEY_ESCAPE: QuitMenu = 1;
                    break;

   case KEY_ENTER : Actions();
                    break;

   case 0         :  KeyPressed = getch();
                     if( KeyPressed == KEY_UP )
                       NewMenuPosition--;
                     else
                      if( KeyPressed == KEY_DOWN )
                       NewMenuPosition++;
  }

  if( NewMenuPosition < 0 )
   NewMenuPosition = MENU_POSITIONS + NewMenuPosition;

  if( NewMenuPosition >= MENU_POSITIONS )
   NewMenuPosition-= MENU_POSITIONS;

  if( NewMenuPosition != OldMenuPosition )
   DrawMenuPositions();
}

Quit();

}
    

void DrawMenu()
{
clrscr();
printf( "    MENU\n"
         "   1. Item1\n"
         "   2. Item2\n"
         "   3. Item3\n"
         "   4. Item4\n"
         "   5. Quit\n\n\n"
         " ESC - Quit" );
}

void DrawMenuPositions()
{
gotoxy( 2, OldMenuPosition + 2);
printf( "%c", 32 ); //space
gotoxy( 2, NewMenuPosition + 2);
printf( "%c", ARROW_CHAR );
}

void Actions()
{
switch( NewMenuPosition )
{
  case 0 : // enter pressed on item1
           break;

  case 1 : // enter pressed on item2
           break;

  case 2 : // enter pressed on item3
           break;

  case 3 : // enter pressed on item4
           break;

  case 4 : QuitMenu = 1;
}
}

void Quit()
{    
_setcursortype( _NORMALCURSOR );
gotoxy( 1, 24 );
exit( 1 );
}
GUEST
Мерси много! Случайно да знаеш някой сайт с информация за 'bios.h', защото явно не е стандартна, но има доста интересни неща.
int21h
QUOTE(GUEST @ Aug 3 2007, 10:07 PM) *
Мерси много! Случайно да знаеш някой сайт с информация за 'bios.h', защото явно не е стандартна, но има доста интересни неща.


Прегледай help-а на компилатора.
GUEST
Пак мерси!:) Това е само за Borland, а за VC++,DEV и т.н. има ли начин без windows.h?
int21h
За Visual C++ се прави конзолен проект.
Гост
Имах предвид това с менюто и по - точно за заместител на bios.h при другите компилатори...
ТОТО
от къде мога да се снабдя с туй Животно ?
int21h
QUOTE(ТОТО @ Dec 12 2007, 12:30 PM) *
от къде мога да се снабдя с туй Животно ?


Google.
Но не мисля, че като си дръпнеш файла ще си решиш проблема..
Polizei
Доколкото помня, 3.хх беше DOS-версия на Borland C, докато 5.хх вече мисля че са WinDoze... И е обяснимо защо bios.h липсва, все пак е хедър към RAW CODE library... Под raw code имам предвид асемблер на ниво прекъсвания за 286... В WinDoze са разрашени само DOS прекъсванията, и почити всички BIOS опции на 98, докато на NT/2K/XP/etc. са само някои, и то под емулатора (NTVDM). Ако е както си мисля, по-добре да се напише конзолно приложение на WinDoze API, където Borland API-то може да се реализира със SetConsole* функциите на WinDoze... А на Linux/BSD просто бих ползвал ncurses :-)
Това е семпла версия на форума. За да видиш пълната версия, която има повече информация, по-добра подредба и снимки, натисни тук.
Invision Power Board © 2001-2008 Invision Power Services, Inc.