Textfarbe im Menu
-
Hallo zusammen
Ich habe ein kleines Problem in C. In meinem Menu welches 5 Zeilen hat möchte ich gerne die Zeile in der sich der Cursor befindet in einer bestimmten Farbe einfärben. Wenn der Cursor die Zeile wieder verlässt müßte die alte Textfarbe wieder hergestellt werden. Den Cursor steuer ich mit den Cursor-Tasten hoch und runter. Das Menu wurde mit cprintf("...") erstellt. Es sollen aber nur die Menupunkte gefärbt werden, da rechts neben dem Menu noch etwas steht. Ich möchte auch nicht, das das Menu jedesmal wieder neu geschrieben wird sondern nur die jeweilige Menuzeile gefärbt wird. Ich glaub, man muß irgendwie direkt in den Bildschirmspeicher schreiben. Ich weiß leider nicht genau, wie ich das umsetzen soll. Hat da jemand was passendes auf Lager?
-
Frag nochmal im DOS-Konsolen Forum nach.
Wenns ne Linux/Unix Shell is, dann unter Linux/Unix mal nachfragen.
-
Frag google nach ansi escape sequences, die können das.
Im Grunde ist das standardisiert, aber unter DOS/Windows kann das etwas kompliziert sein, da funzt das nur, wenn die ansi.sys geladen ist. Ansonsten musste dich halt ans DOS-conio-API wenden, aber damit kenn ich mich nicht aus. Was ANSI-konforme terminals angeht,
puts("\x1B[31mHello, World!\x1B[0m");
sollte das Prinzip verdeutlichen.
-
0xdeadbeef schrieb:
Im Grunde ist das standardisiert, aber unter DOS/Windows kann das etwas kompliziert sein, da funzt das nur, wenn die ansi.sys geladen ist. Ansonsten musste dich halt ans DOS-conio-API wenden, aber damit kenn ich mich nicht aus. Was ANSI-konforme terminals angeht,
puts("\x1B[31mHello, World!\x1B[0m");
sollte das Prinzip verdeutlichen.
Ja, schon, aber mit Escapesequenzen müsste er eben neu schreiben - was er nicht will.
Sollte sich das Problem auf DOS beziehen, so funzts mit:#include <string.h> // nur für strlen() #include <conio.h> // cprintf() // Mit Cursor schaut's bescheiden aus // State = 0: Cursor aus // State sonstwas: Cursor an void SetCursor(int State) { char s = State?13:~0; char e = State?14:~0; asm { MOV AH, 1 MOV CH, s MOV CL, e INT 0x10 } } // Da Dir clrscr() im wahrsten Sinne des Wortes einen Strich durch // dir Rechnung machen würd... void ClearScreen() { asm { MOV AH, 0; MOV AL, 3; // 80 x 25, 16 Farben INT 0x10; } } // Einfärben, und zwar // 0 < x < 81 // 0 < y < 26 void SetPosToColor(int x, int y, unsigned char c) { y--, x--; asm { MOV AH, 2; MOV BH, 0; MOV DH, y; MOV DL, x; INT 0x10; MOV AH, 8; MOV BH, 0; INT 0x10; MOV AH, 9; MOV CX, 1; MOV BL, c; INT 0x10; } } int main() { char Menu[5][15] = {"Anfang", "Nächstes", "Das wird fad!", "tja", "endlich..."}; ClearScreen(); SetCursor(0); for(int i=0; i<5; i++) { cprintf("%s\r\n", Menu[i]); } for(i = 1; i<=strlen(Menu[0]); i++) SetPosToColor(i, 1, 1); int key, PrevSel = 1, Selection = 1; do { key = getch(); if(!key) { key = getch(); if(key==72) { PrevSel = Selection; if(Selection == 1) Selection = 5; else Selection--; for(i = 1; i<=strlen(Menu[Selection-1]); i++) SetPosToColor(i, Selection, 1); for(i = 1; i<=strlen(Menu[PrevSel-1]); i++) SetPosToColor(i, PrevSel, 7); } if(key==80) { PrevSel = Selection; if(Selection==5) Selection = 1; else Selection++; for(i = 1; i<=strlen(Menu[Selection-1]); i++) SetPosToColor(i, Selection, 1); for(i = 1; i<=strlen(Menu[PrevSel-1]); i++) SetPosToColor(i, PrevSel, 7); } } } while(key != 27 && key != 13); ClearScreen(); SetCursor(1); return 0; }
Ich hoff' jetzt sind alle Klarheiten beseitigt
Sollt's fragen zum source geben bin ich jederzeit für dich da...GreeTz, Swordfish
Ähm, von ANSI C sind wir schon Meilen entfernt...
-
Ähm, von ANSI C sind wir schon Meilen entfernt...
lol^^ guter witz!
von Funktionierendem Code sind wir noch weiter entfernt!
:p
mfg hohesC
-
racer2000 schrieb:
Hallo zusammen
Das Menu wurde mit cprintf("...")
da du mit cprintf arbeitest, vermute ich, du hast einen alten borland oder den djgpp.
schau mal nach gotoxy, das hast du dann auch (in deine conio.h), diese compiler fahren das noch. ist alles aber nicht standardmit dieser setzt du einfach genau an diesem punkt an. damit brauchst du nicht neu schreiben und kannst buchstaben"punkt"genau arbeiten.
dieser thread sollte mal ins konsolenforum *g*
-
hohesC schrieb:
Ähm, von ANSI C sind wir schon Meilen entfernt...
lol^^ guter witz!
von Funktionierendem Code sind wir noch weiter entfernt!
:p
mfg hohesC
Was hast du gegen meinen code?
Äh, was hast du für meinen code? -> Event. den falschen Compiler!? Compilierbar mit BorlandC 3.0
-
Hallo Leute
Vielen Dank für Eure schnellen Antworten. Zum besseren Verständnis werde ich mein Problem nochmal genauer erläutern. Also ich benutze den alten guten TurboC-Compiler. Also ich definiere erst ein Fenster mit window(..), schreibe dann mit einer bestimmten Textfarbe in dieses Fenster mein Menu.
cprintf("Untermenu 1\r\n");
cprintf("Untermenu 2\r\n"); usw.
Als nächstes setzte ich den Cursor auf den ersten Buchstaben der ersten Zeile.
(also gotoxy(1,1);) Mit den Cursortasten kann ich den Cursor hoch und runter bewegen. Es soll also je nach Cursorposition der entsprechende Text in dieser Zeile(aber max.15 Spalten) in einer anderen Schriftfarbe ausgegeben werden, ohne das ich das Menu nochmal überschreiben muß. Die Zeile die verlassen wurde muß die ursprüngliche Farbe wieder annehmen. Eigentlich ganz einfach-wenn ich doch nur wüßte wie ???Gruß Eddi