Titelleiste permanent ändern trotz fsStayOnTop?
-
Hallo!
Ich würde gerne die Titelleiste meines Hauptfensters einfärben und ohne "FormStyle = fsStayOnTop" klappt das auch alles ganz prima (in OnPaint implementiert). Nur mit besagter Änderung wird die OnPaint-Routine halt nur beim Start aufgerufen, und die Titelleiste bekommt je nach Aktion wieder die Standardfarbe für aktive bzw. inaktive Fenster.
Gibt's irgendwie ne ordentliche Lösung für das Problem?
Schonmal Danke im voraus,
Christian
-
ja, die Benutereinstellungen respektieren und die Captionfarbe nicht ändern...
Mach es zumindest so, dass der User wählen kann, ob die Captionfarbe geändert werden darf oder nicht.
Ansonsten: Was passiert wenn Du nach den Aktionen, die eine Änderung der Farbe bewirken ein Form->Invalidate() ausführst? Hilft das?
-
Ich will ja nicht nur die Caption-Farbe sondern auch den Hintergrund ändern (im Endeffekt ist es natürlich ein Übermalen der Titelleiste) und es soll ja auch nur für einen einmaligen Warnhinweis sein, da brauch man eigentlich keine Wahloption einbauen denke ich.
Was das Neuzeichnen angeht ist es halt das Problem die Aktionen abzufangen. Wenn ich außerhalb des Fensters klicke wird die Titelleiste grau (=Fenster inaktiv) und wenn ich danach wieder im Fenster klicke blau (=Fenster aktiv).
Muss man da extra Windows-Messages abfangen oder ist das alles unnötig kompliziert?Hab auch schon überlegt ein Formular ohne Titelleiste zu nehmen da ich sie ja eh "zukleister" aber irgendwie sieht der Fenster-Stil da gleich ganz anders aus.
-
Hab's jetzt doch ohne vorgegebene Titelleiste gelöst.
-
Zum Abfangen der Botschaften hätte sich TApplication::OnDeactivate ::OnActivate angeboten...
-
Hoppla, doch so einfach, manchmal sieht man den Wald vor lauter Bäumen nicht. Mir viel nur spontan OnDeactivate des Fensters auf und damit klappts natürlich nicht.
Vielen Dank, habs direkt nochmal umgeändert.
-
hm...jetzt habe ich leider noch das Problem, das der Bereiche der Titelleiste als aktiv (blau) neu gezeichnet wird wenn er außerhalb der oberen oder unteren Bildkante verschwindet und dann wieder vorgeholt wird.
Jemand ne Idee welche Message beim Verlassen des Bildbereichs ausgelöst wird?
-
Poste doch mal die Paint Methode.
-
Die orientiert sich mehr oder weniger an einem Beispiel von Bytes&More:
void __fastcall TErrorMsgMain::FormPaint(TObject *Sender) { TCanvas * FCanvas = new TCanvas(); if(FCanvas) { FCanvas->Handle = GetWindowDC(Handle); TRect rect; rect.Left = 3; rect.Top = 3; rect.Right = Width - 4; rect.Bottom = 21; FCanvas->Brush->Color = clRed; FCanvas->FillRect(rect); FCanvas->Font->Style = TFontStyles()<< fsBold; FCanvas->Font->Color = clWhite; FCanvas->TextOut(4, 5, "Technischer Fehler "+par); delete FCanvas; } }Zusätzlich hab ich dann noch die 2 Funktionen umgeleitet:
Application->OnDeactivate = RepaintMain; Application->OnActivate = RepaintMain;void __fastcall TErrorMsgMain::RepaintMain(TObject * Sender) { Invalidate(); }Löst man das eigentlich so, oder ist das ein schlechter Stil?