Farben individuell
-
Hi,
unter WinXP kann man in den Eigenschaften der Konsole die Farben individuell einstellen, d.h. die RGB-Farbwerte für jede der 16 Paletten-Farben, die letztendlich Vorder- und Hintergrundfarben darstellen, können geändert werden. Kann man dies auch irgendwie programmseitig realisieren ?
Grund:
Ich hab den Quellcode eines alten DOS-Programms, welches ich nach Windows (Win32) portieren möchte. Dort wurde die Einstellung der Farben über Ports (direkter Zugriff auf die Register des VGA-Adapters) erledigt. Das soll nunmehr aus Kompatibilitätsgründen anders gemacht werden. Unter WinXP ist dies halt nutzlos, da nicht nur der NT Kernel die Ausführung von Win32 Port Zugriffen verweigert, sondern es den internen Win32 Funktionen zur Darstellung der Konsole so ziemlich egal sein dürfte.
-
wenn ich dich richtig verstehe: schau dich mal in der konsolenapi um.
link dazu gibts im konsolenfaq.
-
Wenn du mit *konsolenapi* die Konsolen Funktionen aus dem Windows API meinst (AllocConsole() etc.), dort hab ich schon alles durchsucht (MSDN Library Visual Studio 6.0) und leider nix gefunden.
-
schau dir mal die improved console an aus der faq
Improved Consolevielleicht hilft das weiter..
-
Hi,
entwerder habe ich dich nicht richtig verstanden oder du hast nicht gründlich genug nachgeschaut.MSDN:
*The SetConsoleTextAttribute function sets the foreground (text) and background color attributes of characters written to the screen buffer by the WriteFile or WriteConsole function, or echoed by the ReadFile or ReadConsole function. This function affects only text written after the function call.BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, // handle to console screen buffer
WORD wAttributes // text and background colors
);MfG Spacelord
-
Offensichtlich hab ich mich nicht genau ausgedrückt. Die Improved Console Funktionen nützen mir nix. Genau wie beim SetConsoleTextAttribute() aus dem Windows API als auch bei den Improved Console Funktionen (zB setcolor()) gibt man keine tatsächlichen Farben (oder sollte ich Farbwerte sagen) an. *wAttributes* oder wie immer die Variable auch heissen mag, gibt lediglich einen Index an, genauer gesagt 2 Indices (Vordergrund und Hintergrund). Diese Indices referenzieren den Eintrag in eine Palette, welche die tatsächlichen Farbwerte (TrueColor) enthalten.
Beispiel (anhand Improved Console):#define FG_YELLOW ( FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY )
entsprechend wincon.h:
#define FOREGROUND_GREEN 0x0002 // text color contains green. #define FOREGROUND_RED 0x0004 // text color contains red. #define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
aufgelöst ergibt das:
#define FG_YELLOW ( 0x0004 | 0x0002 | 0x0008 ) #define FG_YELLOW ( 0x000e )
Somit erhält man für FG_YELLOW 14. Für BG_YELLOW würde man ebenfalls diesen Wert erhalten. Allerdings beträgt der aufgelöste Wert 0x00e0. Da man die Bits 0..3 für Vordergrund und 4..7 für Hintergrund betrachtet, muss man diesen Wert also um 4 Bits nach rechts schieben.
Schaut jetzt mal bei Farben in den Konsolen-Eigenschaften
(Konsolen-Fenster->Systemmenü->Eigenschaften->Farben) nach. Dort ist eine Palette zu sehen mit 16 Farben. An Position 14 (beginnend mit 0) ist die Farbe gelb (Standard Einstellungen vorausgestzt). Klickt man darauf, werden rechts über der Palette die tatsächlichen (TrueColor) Farbwerte für rot, grün und blau angezeigt. Im Falle von gelb sind das rot=255, grün=255, blau=0. Würde man hier rot=255, grün=0, blau=255 einstellen, würde die Farbe FG_YELLOW mit der ein Programm irgendwann mal erstellt wurde nicht mehr wirklich gelb sondern violett darstellen.
Ich suche also eine Möglichkeit genau diese tatsächlichen Werte (TrueColor) für rot, grün und blau einzustellen.
Ich hoffe das war jetzt nicht noch konfuser als es eh schon ist.
-
Ich habe deine Frage von Anfang an verstanden, aber ich habe keine Antwort darauf ;).
Du willst, dass bei Angabe von z.b. FOREGROUND_RED ein anderes Rot als bisher verwendet wird.
Aber ich glaube nicht, dass das möglich ist -> die Konsole ist und bleibt ein 16-Farben-System. Wären mehr möglich (durch andauerndes umstellen) könnte man doch auch gleich immer RGB-Werte angeben lassen?!
MfG SideWinder
-
Du willst, dass bei Angabe von z.b. FOREGROUND_RED ein anderes Rot als bisher verwendet wird.
So war das Ganze eigentlich gedacht...
Funktionen die die RGB Werte jeder einzelnen Paletten-Farbe festlegen MUSS es geben! Der beste Beweis dafür ist, dass man dies ja *manuell* tun kann. Aber offensichtlich konnte sich MS nicht dazu durchringen, die in ihrer Win API offenzulegen.
Aber ich glaube nicht, dass das möglich ist -> die Konsole ist und bleibt ein 16-Farben-System. Wären mehr möglich (durch andauerndes umstellen) könnte man doch auch gleich immer RGB-Werte angeben lassen?!
Auch wenn immer nur maximal 16 Farben auf einmal angezeigt werden können, so sind doch 16M = 256(rot) * 256(grün) * 256(blau) theoretisch möglich (zumindest im Fenster bei TrueColor). Der Grund dafür, dass MS die Konsolen Farbverwaltung weiterhin über eine Farb-Palette organisiert und nicht über direkte RGB Angaben, liegt wohl in der Abwärtskompatibilität zu DOS Programmen.
Trotzdem nochmal Danke für eure Antworten...