Schrift auf den Bildschirm in der richtigen Farbe.
-
Folgendes Problem: Ich habe im Modus x*y*8 Probleme mit Farben. Wenn ich einen Text mit der Farbnummer 16 auf den Bildschirm bringen will, nimmt er irgendeine beliebige Farbe und versieht die Schrift damit. Ich kann ja
RGB(255,0,0)angeben, um die Farbe Rot zu erhalten für meine Schrift.
Das ist ja gut und schön, nur habe ich die Palette neu definiert. Ich möchte jetzt auf meine selbst definierten Farben zugreifen, hab aber keinen blassen Schimmer, wie ich das anstellen soll.Kennt jemand eine Formel, damit ich angeben kann
DDrawText(0,0,0,0,"Hallo",Farbnummer(16));
Wie kann ich die Funktion Farbnummer() realisieren?
Mein Code um die Schrift auf den Bildschirm zu bringen:
void DDrawText(int x1, int y1, int x2, int y2, char *Text,COLORREF color) { HFONT hFont = CreateFont( 16, 8, 0, 0, FW_THIN, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Lucida Console" ); RECT rc; rc.left=x1; rc.top=y1; rc.right=x2; rc.bottom=y2; lpDDsBack->GetDC(&hDC); SetBkMode(hDC, TRANSPARENT); SelectObject( hDC, hFont ); SetTextColor(hDC, color); DrawText(hDC,Text,(int)strlen(Text),&rc,TRANSPARENT); lpDDsBack->ReleaseDC(hDC); DeleteObject(hFont); }Danke schonmal, Gruß Streusselkuchen!
.....
-
Ganz sicher nimmt der Computer nicht eine beliebige Farbe, sondern genau die Nummer 16. Und wenn du selbst dei Farben definiert hast, dann weisst du doch auch, welche Farbe das ist.
Farbnummer() musst du natürlich so implementieren, dass sie die von dir gewünschte Funktionalität bietet.
Bye, TGGC
-
Genau das ist es, was ich mir eigentlich wünsche. Wenn ich nähmlich
DDrawText(0,0,0,0,"Hallo", 16 );eingebe, nimmt er schwarz als Farbe. Die Farbe 16 ist aber nach meiner Definition Rot!
Ganz sicher nimmt der Computer nicht eine beliebige Farbe
Jupp, das ist sicher richtig, denn bei Farbcode 17 nimmt er immer noch schwarz
Die Farbe ist also nicht beliebig. Theoretisch müsste ja rot zustandekommen, geht aber nicht.
Deswegen meine Frage: Wie rechne meinen Farbcode (8bit) in das COLORREF (32bit) um? Und genau das soll die FunktionCOLORREF Farbnummer(byte ColorCode);tun.
Wie mach ich das?Gruß Streusselkuchen!
ps. Wenn ich Pixel mit der Farbe Nr. 16 auf den Bildschirm bringe (Video-Ram zugriff) bzw. mit Blt den Bildschrim fülle, habe ich die Farbe Rot. Das funktioniert also, nur das mit der Schrift nicht
.
-
Aus 16 kann du die Farbe nicht ausrechnen, darum steht sie ja in der Palette. Ausserde sagst du doch schon selbst, das es Rot wäre.
Bye, TGGC
-
Noch mal die Frage: wie krieg ich Schrift mit der Farbe nr.16 auf den Bildschirm???????
und genau das ist doch das Problem. Wie?
ER MACHT NICHT NR. 16 AUF DEN BILDSCHIRM, WARUM AUCH IMMER.
sondern er nimmt eine andere Nummer, von der ich nicht einmal weiß, welche das ist.
-
Was ist der Rückgabewert von Farbnummer() bzw. wie baust du diesen zusammen? Was erwartet SetTextColor() als zweiten Parameter?
-
Ich habe mir die Funktion Farbnummer(byte color) noch nicht zusammengebaut.
Ich habe die Farbe immer direkt per Nummer eingegeben und das hat nicht geklappt.
Also DDrawText(...,16);
Deswegen war meine Frage, wie ich denn die Funktion Farbnummer realisieren kann.Meine Theorie: Windows denkt ich teile ihm mit meiner Farbnummer mit, wieviel rot, bzw. wie viel Grün / Blau ich haben will. Da ich jetzt aber alle Farben neu definiert habe, kann die angabe mit RGB(r,g,b) nicht Funktionieren.
Man müsste meine Farbnummer umwandeln (in ein COLORREF) und Windows vorgaukeln, ich gäbe gewünschte R,G,B an, welches Windows dann automatisch in meinen Farbcode umwandelt, den ich ja nicht direkt mitteilen kann.Die Farben habe ich neudefiniert, weil ich bestimmte Farbübergange brauche,
ich kann ja mit Video-RAM Direktzugriff meine gewünschten Farben per Farbcode zeichnen. (also Pixel)Edit:
COLORREF SetTextColor(HDC hDc,COLORREF color);
-
Naja, ich würd mir dann irgendwo in ner Hashmap die Farbcodes mit zugehörigem COLORREF speichern die du dann per Farbnummer() Methode ausließt.
Oder noch besser du baust dir ne Farbnummer-Klasse mit ner Statischen Methode die dir das passende COLORREF zurückliefert (auch mit Hashmap).
-
BugJoe schrieb:
Naja, ich würd mir dann irgendwo in ner Hashmap die Farbcodes mit zugehörigem COLORREF speichern die du dann per Farbnummer() Methode ausließt.
Oder noch besser du baust dir ne Farbnummer-Klasse mit ner Statischen Methode die dir das passende COLORREF zurückliefert (auch mit Hashmap).
LOL, dafür gibts doch schon die Palette! Das sagte ich doch bereits.
Streusselkuchen, logisch "denkt" Windows das. Schliesslich übergibst du doch die 16 als Farbe. Und wieso soll RGB(r,g,b) nicht funktionieren? Dafür gibts doch SetTextColor!
Bye, TGGC
-
Streusselkuchen, logisch "denkt" Windows das. Schliesslich übergibst du doch die 16 als Farbe. Und wieso soll RGB(r,g,b) nicht funktionieren? Dafür gibts doch SetTextColor!
@TGGC Ich habe 256 Farben zur Verfügung,-> 256 Farb modi (DirectDraw (1024*768*8bit)
Jede dieser 256 Farben habe ich definiert (Mit SetPalette). Damit kann ich dann Farbübergänge erhalten und bestimmte Farben brauch ich nicht.Deswegen KANN RGB nicht funktionieren!
Ich weiß, das nummer 16 Rot ist, kann diese Farbe aber nicht erzeugen (Mit Schrift). Und vielleicht brauch ich ja irgendwann irgendeine andere Nummer.
Wenn ich Pixel mit Farbe 16 Zeichne geht es, mit der Schrift nicht.@BugJoe
Die Idee mit der Hashmap ist vielleicht ganz gut, nur weiß ich nicht, auf welches COLORREF windows welchen Farbcode zurückliefert.
EDIT: Und bei 256 Farben ist das sehr aufwändig, alles rauszusuchen!Eine andere Idee ist mir noch gekommen: Irgendwie muss es ja funktionieren
8bit #7 #6 #5 #4 #3 #2 #1 #0 -> Welches dieser Bits ist für welche Farbe zuständig? zB.: #7 #6 #5 für rot #5 #4 #3 für grün und der Rest für Blau?
Ist das so, wenn nicht, wie dann?Das muss dann per Schiebebefehle in 32 bit konvertiert werden.
Wie ist das bei 32 bit aufgebaut? (#31-#x R, ... G ...
Danke schonmal, Gruß Streusselkuchen.
-
Streusselkuchen schrieb:
@TGGC Ich habe 256 Farben zur Verfügung,-> 256 Farb modi (DirectDraw (1024*768*8bit)
Jede dieser 256 Farben habe ich definiert (Mit SetPalette). Damit kann ich dann Farbübergänge erhalten und bestimmte Farben brauch ich nicht.Deswegen KANN RGB nicht funktionieren!
Ich weiß, das nummer 16 Rot ist, kann diese Farbe aber nicht erzeugen (Mit Schrift). Und vielleicht brauch ich ja irgendwann irgendeine andere Nummer.
Wenn ich Pixel mit Farbe 16 Zeichne geht es, mit der Schrift nicht.@BugJoe
Die Idee mit der Hashmap ist vielleicht ganz gut, nur weiß ich nicht, auf welches COLORREF windows welchen Farbcode zurückliefert.
EDIT: Und bei 256 Farben ist das sehr aufwändig, alles rauszusuchen!Eine andere Idee ist mir noch gekommen: Irgendwie muss es ja funktionieren
8bit #7 #6 #5 #4 #3 #2 #1 #0 -> Welches dieser Bits ist für welche Farbe zuständig? zB.: #7 #6 #5 für rot #5 #4 #3 für grün und der Rest für Blau?
Ist das so, wenn nicht, wie dann?Das muss dann per Schiebebefehle in 32 bit konvertiert werden.
Wie ist das bei 32 bit aufgebaut? (#31-#x R, ... G ...
Danke schonmal, Gruß Streusselkuchen.
Du hast weder verstanden wie die GDI Funktionen arbeiten, noch wie das mit der Palette funktioniert. Wo soll ich also anfangen?
Bye, TGGC
-
Möglicher weise hab ich es wirklich nicht verstanden. Dann sag mir bitte, wie ich es hinkriege, schrift in meiner gewünschten Farbe anzugeben. Denn wenn ich als Farbwert RGB(255,0,0) angebe, erhalte ich kein Rot, gebe ich als Farbwert RGB(0,255,0) an, erhalte ich kein Grün.
Ich weiß auch nicht, wie ich den Farbwert nr. sonstwas hier angeben kann.
Ich habe mir eine Assembler-Procedur geschrieben, die Bilder auf den Bildschirm bringen kann. Hier wie gesagt funktioniert das mit den Farbwerten (0-255) ganz prima, er gibt mir die Bilder ordentlich aus. (eigenes Format)
Nur spricht halt die DrawText(...) & SetTextBK(...) nicht an.Bin für jede Hilfe dankbar.
Gruß Streusselkuchen.
-
Dann muss dein Windows wohl kaputt sein. Farbnummer kannst du nur für das entsprechende Makro nehmen. RGB geht nunmal nur mit RGB (ach?!).
Bye, TGGC
-
@TGGC Nein, mein Windows ist nicht kaputt. Ich dachte, ich hätte das schon erklärt.
RGB ist nur ein Makro und berücksichtigt die vorhandene Palette nicht, sondern es geht von einer bestimmten Palette aus, die ja beim erstellen des 256-Farben Modus schon vorhanden ist.->So funktioniert das RGB ja auch ganz prima: geb ich RGB(255,0,0) an, erhalte ich rot.Was ist aber, wenn ich Farbübergange brauche, wie zB.: Schwarz zu Weiß???
Genau: Palette neu definieren, außerdem lassen sich auch tolle Effekte ereichen, wenn wärrend des Laufens die Palette verändert wird.
lpDDPalette->GetEntries(0, 0, 256, palEntry); ... lpDDPalette->SetEntries(0, 0, 256, palEntry);Verstehst du jetzt, warum ich die nummer haben will?
-
Häää? Farbübergang von Schwarz zu Weiß einfach von RGB(0,0,0) zu RGB(255,255,255) durchgehen? Da brauchst du doch gar keine Farbpalettennummer...
-
Das mit einer s/w Palette kein Rot gemalt wird ist ja wohl klar...
Bye, TGGC
-
Mit 256 wirst eh ein überlauf machen

-
@Dali: Beim 256 Farben Modus, den ich verwende gibt es (bevor ich die Palette neu definiert habe) KEINEN schönen übergang von Schwarz zu weiß.
@TGGC Ich nutze nicht die ganze palette für den Farbübergang von Schwarz zu Weiß, sondern nur einen Teilausschnitt.
Farbe 16-72 -> Farbübergang rot zu Gelb, dann gibt es noch Blau zu weiß, und sonstige Farbenübergänge, die ich gut verwenden kann.@Dali 2. Antwort: Ja es ist mir schon klar, das ich als Maximale Farbnummer 255 ansprechen kann

Herzlilche Grüße, Streusselkuchen.
-
Sorry aber was du machst ist einfach Bullshit... Nimm das RGB Makro rgb von 0 bis 255 und das ist ein schöner Übergang sonst machst was falsch...
..das ich als Maximale Farbnummer 255 ansprechen kann..
besser wäre müssen...
-
besser wäre müssen
Keine sorge, ich schreibe keine Pixel, deren Wert nicht in ein byte passt. Ich weiß jetzt nicht, warum du sowas schreibst, vielleicht deswegen?
lpDDPalette->GetEntries(0, 0, 256, palEntry); ... lpDDPalette->SetEntries(0, 0, 256, palEntry);Ich glaube kaum, dass das jetzt eine Neuigkeit ist: Es werden insgesammt 256 Farben per Setpalette definiert, nicht von 0-256 (was ja insgesamt 257 wäre).
Nimm das RGB Makro rgb von 0 bis 255 und das ist ein schöner Übergang sonst machst was falsch...
Ich kann das doch nicht, weil ich doch nur 256 Farben habe. Und wenn ich 32 Farben mit Schwarz zu Weiß definiert habe, die sich sonstwo befinden, wo nur ich (als Programmierer) weiß wo... Verdammt noch mal: RGB kann wegen meiner Farbneudefinition nicht funktionieren! (Und funktioniert übrigens auch nicht!)
Außerdem könnte es doch sinnvoll sein, wenn ich zum Beispiel Schrift mit Farbcode n erzeuge, und nur den Farbwert von n durchschalte (Edit: mit Setpalette), und damit tolle Farbvibrationseffekte erhalte.
Wie auch immer, ich werd das mit Colorref (Die Umwandlung) mal probieren. Wenn jemand eine Antwort hat, die a) sinnvoll ist und sich b) mit meinem Problem befasst, kann er sie gerne hier posten, ansonsten bitte bleiben lassen.
(Ich glaube fast, dass irgendwie keiner meine Problematik versteht, oder die, die es tun, keine Antwort parat haben, ich hoffe nur, dass ich mich in diesem Punkt irre)Gruß Streusselkuchen
-
Streusselkuchen schrieb:
Wie auch immer, ich werd das mit Colorref (Die Umwandlung) mal probieren.
RGB wandelt die Daten doch in ein COLORREF um...
Warum soll RGB eigentlich nicht funktionieren? Wenn ich meinen Desktop auf 8bit schalten funktionieren mein Programme doch trotzdem ohne das sie wer auf die 8Bit Palette umschreibt und sie intern immer noch SetColor(blubb) verwenden. Wie gesagt, du hast das mit dem GDI wohl noch nicht so recht verstanden...
Bye, TGGC