Autor |
Beitrag |
Bastler
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: Do 01.12.11 20:26
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
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Di 13.12.11 12:52
Es müsste funktionieren, wenn du alle Controls des Fensters durchläufst und dann jedes invertierst.
|
|
Tropby
Beiträge: 71
Erhaltene Danke: 4
Vista, Win XP, Win 89
Turbo Delphi Ex.
|
Verfasst: 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:
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
_________________ Tropby
Für diesen Beitrag haben gedankt: Bastler
|
|
bummi
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Für diesen Beitrag haben gedankt: Bastler
|
|
trm
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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 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
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
Für diesen Beitrag haben gedankt: Bastler
|
|
Bastler
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Fr 02.03.12 14:32
Na, das ging aber schnell mit Deiner Antwort
Schönes Wochenende
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 02.03.12 17:10
Bastler hat folgendes geschrieben : | Meine Vorstellung ist, auf Knopfdruck eine Nachtdarstellung zu bekommen. |
Vielleicht wäre ja dieser Forenbeitrag etwas für dich: www.delphi-forum.de/...steuern_97212,0.html
Hier steht noch Genaueres: msdn.microsoft.com/e...2656%28VS.85%29.aspx
|
|