Entwickler-Ecke
Multimedia / Grafik - Farbdarstellung eines Formular invertieren
Bastler - Do 01.12.11 20:26
Titel: Farbdarstellung eines Formular invertieren
Hallo Leute,
ich habe folgende Problemstellung:
Auf einem Formular werden diverse Komponenten gezeigt (StringGrid, Panels, Buttons, Labels etc.) und von einem Bediener benutzt, der in einem Fahrzeug sitzt. Nachts blendet die Darstellung auch noch, wenn man die Laptop-Helligkeit an den Anschlag runterdreht. Meine Vorstellung ist, auf Knopfdruck eine Nachtdarstellung zu bekommen. Nachtdarstellung soll bedeuten, dass die Inhalte des Formulars (durchgehend Schwarz/Weiss) invertiert werden (aus schwarz wird weiss und umgekehrt). Ich habe schon Experimente mit InvertRect angestellt. Bin aber unzufrieden, weil ich jede Komponente für sich invertieren müsste. Wenn man ein Panel drüberlegt und invertiert, kann man nichts mehr bedienen.
Jetzt meine Frage: Gibt es eine Methode einen kompletten Formularinhalt elegant zu invertieren (und wieder zurück)? wenn ja, welche Methode? (das Prog soll unter XP und Win7 laufen)
Danke schon jetzt für eure Tips!
baka0815 - Di 13.12.11 12:52
Es müsste funktionieren, wenn du alle Controls des Fensters durchläufst und dann jedes invertierst.
Tropby - Mi 14.12.11 11:25
Hallo,
ich würde das ganze etwas anders lösen. Invertieren verfälscht ja schon sehr die Farben. Und ob es da gerade dunkler wird hängt von der Oberfläsche ab. Buttons selbst haben ja z.B. garkeinen Color Wert. Ich würde es wohl eher so lösen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| private FDunkel : Boolean; function ChangeColor( Color : Integer; IsDark : Boolean ) : Integer;
function TForm1.ChangeColor( Color : Integer; IsDark : Boolean ) : Integer; var r, g, b, a : Byte; begin r := ( Color and $000000FF ) shr 0; g := ( Color and $0000FF00 ) shr 8; b := ( Color and $00FF0000 ) shr 16; a := ( Color and $FF000000 ) shr 24;
if IsDark then begin r := r * 2; g := g * 2; b := b * 2; end else begin r := r div 2; g := g div 2; b := b div 2; end;
result := Integer( r ) shl 0 + Integer( g ) shl 8 + Integer( b ) shl 16 + Integer( a ) shl 24; end;
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin
for I := 0 to self.ComponentCount - 1 do begin if Self.Components[ I ] is TPanel then begin TPanel( Self.Components[ I ] ).Color := ChangeColor( TPanel( Self.Components[ I ] ).Color, FDunkel ); TPanel( Self.Components[ I ] ).Font.Color := ChangeColor( TPanel( Self.Components[ I ] ).Font.Color, FDunkel ); end else if Self.Components[ I ] is TStringGrid then begin TStringGrid( Self.Components[ I ] ).FixedColor := ChangeColor( TStringGrid( Self.Components[ I ] ).FixedColor, FDunkel ); TStringGrid( Self.Components[ I ] ).Color := ChangeColor( TStringGrid( Self.Components[ I ] ).Color, FDunkel ); TStringGrid( Self.Components[ I ] ).Font.Color := ChangeColor( TStringGrid( Self.Components[ I ] ).Font.Color, FDunkel ); end; end;
Self.Color := ChangeColor( Self.Color, FDunkel );
FDunkel := not FDunkel;
end; |
Im Grunde wird jede Farbe halbiert. Man könnte auch noch anderes machen. Hierbei kann es aber sogar ganz kleine abweichungen bei der wieder hellmach rotine geben (Rundungsfehler).
Gruß
Tropby
bummi - Mi 14.12.11 11:32
na wenn dimmen langt würde ich folgendes bevorzugen.
Ein neues duchklickbares, semitransparentes Form drüberlegen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TDimmForm.FormCreate(Sender: TObject); begin AlphaBlend := true; AlphaBlendValue := 128; Color := clBlack; BorderStyle := bsNone; WindowState := wsMaximized;
FormStyle := fsStayOnTop; SetWindowLong(Handle, GWL_EXSTYLE, getWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT); end; |
trm - Fr 16.12.11 04:42
Hallo,
eine andere Möglichkeit wäre, wenn Dein Programm die Farben vererbt und nicht für jedes Object eine eigene Farbe benutzt, die Form-Farben zu ändern.
Somit kannst Du
Form1.Color := clBlack;
Form1.Font.Color := clWhite;
nutzen und dies bei Bedarf zurücksetzen.
Schöner ist es allerdings mit Näherungen zu arbeiten, um Kontraste von Komplementärfarben besser zu erhalten, da die oftmals genannte Variante ( Komplementaer := ColorToRGB(Original) xor $FFFFFF; ) bei Graustufen nicht mehr funktioniert.
Probier es dann mal damit (gefunden auf
http://www.delphigroups.info/2/10/314913.html):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function GetGrayLevel(const Color: TColor): Integer; begin Result := (77 * (Color and $FF) + 151 * (Color shr 8 and $FF) + 28 * Color shr 16 and $FF) shr 8; end;
function GetGoodContrast(const Color: TColor): TColor; begin if GetGrayLevel(Color) < 128 then Result := clWhite else Result := clBlack; end; |
Verwendet werden kann das folgendermaßen:
Delphi-Quelltext
1: 2:
| Form1.Color := clBlack; Form1.Font.Color := GetGoodContrast(Form1.Color); |
Viel Erfolg :)
Bastler - Fr 02.03.12 14:10
Coole Beiträge. Danke! auf die Schnelle, konnte ich das transparente Fenster am einfachsten umsetzen. Die Vererbung werde ich mir mal ansehen!
trm - Fr 02.03.12 14:32
Na, das ging aber schnell mit Deiner Antwort :P
Schönes Wochenende :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!