Textfarbe von static
-
Hallo,
ich möchte die Textfarbe von static-Fenstern verändern. Und damit nicht gleich alles "Schau in die FAQs" schreien, so einfach isses leider nicht:
Ich habe einen timer, der alle 1/10 Sekunde den Wert einer Variablen ausliest. In Abhägigkeit davon soll ein static einen neuen Inhalt und eine neue Textfarbe bekommen. Mit dem Inhalt ist das auch kein Problem, SetWindowText(...) regelt das wunderbar.
Aber wie mache ich das mit der Farbe. WM_CTLCOLORSTATIC wird nur einmal aufgerufen, wenn das Fenster erzeugt wird. Und
hdc=GetDC(hwnd) und dann
SetTextColor(hdc, RGB(...))funktioniert auch nicht.
Und mit SendMessage(hwnd, WM_CTLCOLORSTATIC, wParam, lParam)klappt es irgendwie auch nicht.Was kann ich tun???
Danke,
Sebastian
-
Du könntest dir doch selbst ein kleines Contröllchen schreiben!
-
-
Ich meine, du könntest dir selbst ein kleines Steuerelement (Control :D) schreiben!
-
Oh, ach so....
Nein im Ernst: Ich gestehe, dass ich keine Ahnung habe, was Du meinst.
-
argh, ich meine eigene Fensterklasse mit eigener Fensterprozedur! Also einfach sowas wie die "Static"-Fensterklasse nachbilden
-
Das muss doch einfacher gehen
-
jo, vielleicht das Control subclassen und die WM_PAINT Nachrichten abfangen und selbst zeichnen!
Ist vom Aufwand denk ich mal fast das gleiche als ein eigenes Control, weil ein Static-Control macht ja nicht soo viel mehr als einfach nen Text auszugeben
-
Klar geht das einfacher CTLCOLORSTATIC is ja schonma ein guter anfang
HBRUSH g_hbrBackground = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); // am besten über main . . . case WM_CTLCOLORSTATIC: { if((HWND)lParam == hDeinStatic) { HDC hdcStatic = (HDC)wParam; SetTextColor(hdcStatic, RGB(0, 0, 255)); SetBkColor(hdcStatic, GetSysColor (COLOR_BTNFACE)); return (LONG)g_hbrBackground; } }
das sollte es eigentlich gewesen sein kann sein das ich was vergesse hab sieht aber so gut aus ansonsten meld ich mich nochma
viel spass damit
mfg
-
Huch da hab ich wohl was falsch verstanden *G* man sollte die frage auchma richtig lesen
-
Hallo,
für alle die es interessiert: das Problem ist inzwischen gelöst.
Ich weiß nicht, wie brilliant diese Lösung ist, bei mir funktioniert es aber.
Man kann in static einfache Textausgaben mit TextOut machen. Diese haben dann eine vorher definierte Farbe/Hintergrundfarbe. Ich habe einfach eine Funktion
geschrieben, die ich statt SetWindowText aufrufe. Bei mir sah das so aus:void SetWindowAn(HWND hwnd) { HDC hDC; hDC=GetWindowDC (hwnd); SetBkColor(hDC, RGB(130,130,130)); //meine Hintergrundfarbe: Dunkelgrau SetTextColor (hDC, RGB(255,0,0)); //meine Textfarbe: ROT TextOut(hDC, 0,0," AN ", 6); ReleaseDC(hwnd, hDC); }
Ich brauchte eben nur einen einzeiligen Text "AN" zu schreiben. Aber ich bin sicher, Ihr schafft es, die Funktion auf eure Bedürfnisse anzupassen.
Im übrigen ist es nicht notwendig, die WM_PAINT Befehle des static abzufangen, Windows merkt sich (zumindest bei mir ) den Inhalt des statics und stellt ihn ggf. wieder her.
Mit SetWindowText kann man dann eben den "alten" Zustand wiederherstellen.
Gruss,
Sebastian
-
ps:
als hwnd übergebe ich das Handle des static.
-
Und was denkst Du, wo ist das Problem in Deiner Funktion?
Änder mal die Textfarbe, danach öffne ein Fenster, welches sich über Dein Fenster legt und dann bringe Dein Fenster wieder in den Vordergrund! Was passiert?
-
Hab ich gemacht, ist alles ok. Habe es aber noch nicht auf anderen Rechnern oder mit anderen Windows-Versionen probiert.
-
Die Verarbeitung von WM_CTLCOLORSTATIC ist schon richtig. In dieser Message weist du dem Control die Farbe über SetTextColor((HDC)wParam, RGB(255,128,64)); zu. Damit die Message kommt, wenn du willst, dass sich die Farbe ändert musst du ein Neuzeichnen des Staticcontrols mittles InvalidateRect(hStatic, 0, true); erzwingen.
-
Ha. Ich habs.
wie ich gaaanz oben beschrieben habe, nutze ich einen Timer von 1/10s, der das Feld ständig aktualisiert.... Also fällt es bei mir gar nicht auf, wenn das Feld übermalt wird. Also muss man doch die WM_PAINT Nachrichten abfangen, wenn man das nicht so macht wie ich (schäm).
-
Danke für alle Antworten. Problem gelöst.
-
@ D@niel $chumann:
Oh Mann, das war zu einfach. Da hätte man echt drauf kommen müssen.