Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

C++ menysystem dosbaserat?

Hejsanhoppsan!

har slagit upp en gammal C++ bok och tänkte börja programmera lite igen. Kommer ihåg att jag lekte lite med ett bibliotek som styrde färger på text och bakgrunden i DOS m.m.

Känner mig rätt så novice när det gäller programmering men är ute efter att göra ett dosbaserat program, med blå bakgrund, samt med ett menysystem som man kan flytta runt en markör eller markerad text?

Tänk er ett gammalt kassasystem med blå bakgrund och gul text?

exempelvis.

1. [Lägg till ny] <--- ska föreställa markering med typ ifylld rektangel
2. Ändra
3. Sök
0. Avsluta

när jag sedan ska till 2.Ändra trycker jag exempelvis. "pil ner" så ska markeringen flyttas till Ändra.

Har liksom inte den blekaste hur jag ska få till den här typen av design på ett dosbaserat program men det kanske finns någon själ här på forumet som förstår min fina förklaring Eller har än bättre design ide?

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008
Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007

Misstänker att curses eller ncurses kan vara av intresse här, förutsatt att du sitter på något unix-baserat.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

hittade på Ncurses development kit http://ndk-xx.sourceforge.net/ se om jag lyckas göra nå menysystem med det. tack för hjälpen

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008

Det är specialtecken som man skriver ut till konstollfönstret.
Har inga exempel eller så, men jag kanske kan fixa något enkelt till dig att studera.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

hehe oj va snabb du va att svara, ändrade mitt inlägg medans du svarade. Provade att skriva ut texten med en vanlig cout << men det fungerade inte. Ska kika lite på ncurses men hittar du på något är det bara att posta.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av You
Misstänker att curses eller ncurses kan vara av intresse här, förutsatt att du sitter på något unix-baserat.

fungerar inte ncurses i windows miljö?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2007
Citat:

Ursprungligen inskrivet av Bitzo
fungerar inte ncurses i windows miljö?

Vet inte om det finns någon ncurses för windows, det är mycket möjligt.
Verkar finnas några, typ PDCurses.

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008
Citat:

Ursprungligen inskrivet av Bitzo
hehe oj va snabb du va att svara, ändrade mitt inlägg medans du svarade. Provade att skriva ut texten med en vanlig cout << men det fungerade inte. ...

Jag testade också lite och det verkar inte som om det fungerar i Windows. Synd att de tagit bort stödet för så pass trevliga funktioner. I Linux gick det hur bra som helst.

Hittar man inget enkelt bibliotek att använda så verkar det som man får använda win32apiet.

http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

GetConsoleWindow tillsammans med SetConsoleTextAttribute kanske.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

hur lär man sig win32api snabbast möjligast då? tutorialsidor eller ska man införskaffa sig någon bok?

kanske är bäst jag gör ett vanligt tråkigt dosprogram först innan jag ger mig in på win32apiet?

tack för hjälpen

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008

Snabbast möjliga? Eftersom du endast är intresserad av ett par funktioner så är det lättast att slå upp dem i referensmanualel som jag länkade till. win32apiet behöver du endast till att färga text och eventuellt ställa in markörposistion.

win32api berör hela operativsystemet så förvänta dig inte att du lyckas lära dig hela på ett par dagar.

Om du vill så kan jag skriva ihop ett par funktioner som du kan använda.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av Korkskruv
Snabbast möjliga? Eftersom du endast är intresserad av ett par funktioner så är det lättast att slå upp dem i referensmanualel som jag länkade till. win32apiet behöver du endast till att färga text och eventuellt ställa in markörposistion.

win32api berör hela operativsystemet så förvänta dig inte att du lyckas lära dig hela på ett par dagar.

Om du vill så kan jag skriva ihop ett par funktioner som du kan använda.

Så som du förklarar så räcker det med att jag använder etc. windows.h för att komma åt api funktionerna och endast ändra textfärg/bakrund i ett dosprogram?

eller måste jag programmera ett helt nytt fönster?

skriv gärna ihop nån kod som jag kan labba lite med.

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008

Jag har inte själv testat men så här gissar jag att det fungerar.

Inkludera windows.h
Använd GetConsoleWindow för att få en variabel som du kan använda till övriga funktioner.
Anropa SetConsoleTextAttribute med ovanstående plus färgen enligt referensmanualen.

Skriva ut text och så vidare använder du vanliga c++ funktioner.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

tror jag börjar bli lite klokare nu

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Med största sannolikhet vill du nog som sagt använda något ncursesaktigt om det skall finnas någon interaktivitet (markörförflyttningar och liknande). Det enklaste (om än inte det snyggaste) sättet att åstadkomma blå bakgrund på en windowsmaskin borde för övrigt vara att anropa "color":

#include <cstdlib> //....... system("color 1e");

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av Elgot
Med största sannolikhet vill du nog som sagt använda något ncursesaktigt om det skall finnas någon interaktivitet (markörförflyttningar och liknande). Det enklaste (om än inte det snyggaste) sättet att åstadkomma blå bakgrund på en windowsmaskin borde för övrigt vara att anropa "color":

#include <cstdlib> //....... system("color 1e");

bra tips, men går det att styra textfärgen eller bara markera textbakgrunden med en viss färg med detta?

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Bitzo
bra tips, men går det att styra textfärgen eller bara markera textbakgrunden med en viss färg med detta?

Kommandot gäller hela terminalfönstret och det första tecknet bestämmer bakgrundsfärg och det andra bestämmer teckenfärg.

system("color e1");

ger till exempel blå text på gul bakgrund. Kör "color -h" för att se de möjliga färgerna.

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008

Jag kunde inte låta bli att roa mig lite...

Inget avancerat. Byta färg och flytta markör.

#include <iostream> #include <windows.h> namespace DOS { static HANDLE hout; static HANDLE hin; static WORD current_attrib; static WORD old_attrib; static short width; static short height; void init() { hout = GetStdHandle(STD_OUTPUT_HANDLE); hin = GetStdHandle(STD_INPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(hout, &info); old_attrib = current_attrib = info.wAttributes; width = info.srWindow.Right + 1; height = info.srWindow.Bottom + 1; } enum COLOR {BLACK, WHITE, RED, BLUE, YELLOW}; enum BGCOLOR {BG_BLACK, BG_WHITE, BG_RED, BG_BLUE, BG_YELLOW}; enum ATTRIB {RESET}; enum ARROW {NONE, UP, DOWN, LEFT, RIGHT}; void set_color_attrib(bool red, bool green, bool blue, bool intensity) { current_attrib = red ? current_attrib | FOREGROUND_RED : current_attrib & ~FOREGROUND_RED; current_attrib = green ? current_attrib | FOREGROUND_GREEN : current_attrib & ~FOREGROUND_GREEN; current_attrib = blue ? current_attrib | FOREGROUND_BLUE : current_attrib & ~FOREGROUND_BLUE; current_attrib = intensity ? current_attrib | FOREGROUND_INTENSITY : current_attrib & ~FOREGROUND_INTENSITY; } std::ostream& operator<< (std::ostream& cout, const COLOR &color) { switch (color) { case BLACK: set_color_attrib(0, 0, 0, 0); break; case WHITE: set_color_attrib(1, 1, 1, 1); break; case RED: set_color_attrib(1, 0, 0, 1); break; case BLUE: set_color_attrib(0, 0, 1, 1); break; case YELLOW: set_color_attrib(1, 1, 0, 1); break; } SetConsoleTextAttribute(hout, current_attrib); return cout; } std::ostream& operator<< (std::ostream& cout, const ATTRIB &attrib) { switch (attrib) { case RESET: current_attrib = old_attrib; SetConsoleTextAttribute(hout, current_attrib); break; } return cout; } void set_bg_color_attrib(bool red, bool green, bool blue, bool intensity) { current_attrib = red ? current_attrib | BACKGROUND_RED : current_attrib & ~BACKGROUND_RED; current_attrib = green ? current_attrib | BACKGROUND_GREEN : current_attrib & ~BACKGROUND_GREEN; current_attrib = blue ? current_attrib | BACKGROUND_BLUE : current_attrib & ~BACKGROUND_BLUE; current_attrib = intensity ? current_attrib | BACKGROUND_INTENSITY : current_attrib & ~BACKGROUND_INTENSITY; } std::ostream& operator<< (std::ostream& cout, const BGCOLOR &bg_color) { switch (bg_color) { case BG_BLACK: set_bg_color_attrib(0, 0, 0, 0); break; case BG_WHITE: set_bg_color_attrib(1, 1, 1, 1); break; case BG_RED: set_bg_color_attrib(1, 0, 0, 1); break; case BG_BLUE: set_bg_color_attrib(0, 0, 1, 1); break; case BG_YELLOW: set_bg_color_attrib(1, 1, 0, 1); break; } SetConsoleTextAttribute(hout, current_attrib); return cout; } void clear_screen() { system("cls"); } void set_position(short x, short y) { COORD coord = {x, y}; SetConsoleCursorPosition(hout, coord); } bool check_keyboard() { INPUT_RECORD input; DWORD number_read = 0; PeekConsoleInput(hin, &input, 1, &number_read); return number_read > 0; } ARROW get_keyboard() { INPUT_RECORD input; DWORD number_read = 0; ReadConsoleInput(hin, &input, 1, &number_read); if (input.EventType == KEY_EVENT) { switch (input.Event.KeyEvent.wVirtualKeyCode) { case VK_UP: return UP; case VK_DOWN: return DOWN; case VK_RIGHT: return RIGHT; case VK_LEFT: return LEFT; default: return NONE; } } else return NONE; } std::istream& operator>> (std::istream& cin, ARROW &arrow) { arrow = get_keyboard(); return cin; } }; int main() { DOS::init(); DOS::clear_screen(); DOS::set_position(0, 0); std::cout<<"Te"<<DOS::WHITE<<"s"<<DOS::RESET<<"t"<<std::endl; std::cout<<DOS::YELLOW; std::cout<<"Width: "<<DOS::width<<std::endl; std::cout<<"Height: "<<DOS::height<<std::endl; std::cout<<DOS::RED; std::cout<<"Press arrow key..."<<std::flush; DOS::ARROW arrow; std::cin>>arrow; switch (arrow) { case DOS::NONE: std::cout<<"No arrow key!"<<std::endl; break; case DOS::UP: std::cout<<"UP!"<<std::endl; break; case DOS::DOWN: std::cout<<"DOWN!"<<std::endl; break; case DOS::RIGHT: std::cout<<"RIGHT!"<<std::endl; break; case DOS::LEFT: std::cout<<"LEFT!"<<std::endl; break; } std::cout<<DOS::RED<<DOS::BG_BLUE; DOS::set_position(0, 5); std::cout<<"Test2"<<DOS::RESET<<std::endl; }

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

De där va ju klockrent korkskruv. tack tack ska leka runt lite med det där och se om jag lyckas få ihop något.

tack tack

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009

vad finns det för funktion som räknar ut dos-fönstrets storlek? Tänkte för placeringen av menyn så att man får den centrerad?

Trädvy Permalänk
Medlem
Plats
Söder
Registrerad
Jun 2008

Adderade DOS::width och DOS::height till koden ovan.

Ska göra en liten ändring till.

Edit: Ändring utförd. Fixade så det blev lättare och mer tydligt att lägga till färger.
Edit: Lite tangentbord också.
Edit: Tangentordet får ju stödja std::cin också.

Trädvy Permalänk
Medlem
Plats
Gefle
Registrerad
Sep 2009
Citat:

Ursprungligen inskrivet av Korkskruv
Adderade DOS::width och DOS::height till koden ovan.

Ska göra en liten ändring till.

Edit: Ändring utförd. Fixade så det blev lättare och mer tydligt att lägga till färger.
Edit: Lite tangentbord också.
Edit: Tangentordet får ju stödja std::cin också.

de där är ju guld värt nu har jag en bra grund att labba med