Farbdarstellung eines Formular invertieren
spacer
Autor Nachricht
Bastler
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1



BeitragVerfasst: 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!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: Di 13.12.11 12:52 
Es müsste funktionieren, wenn du alle Controls des Fensters durchläufst und dann jedes invertierst.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Tropby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 979
Erhaltene Danke: 124

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 14.12.11 11:32 
na wenn dimmen langt würde ich folgendes bevorzugen.
Ein neues duchklickbares, semitransparentes Form drüberlegen
ausblenden Delphi-Quelltext markieren
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
DRY DRY KISS

Für diesen Beitrag haben gedankt: Bastler
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 312
Erhaltene Danke: 7

Windows 7x64
Delphi 7
BeitragVerfasst: 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):

ausblenden Delphi-Quelltext markieren
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:

ausblenden Delphi-Quelltext markieren
1:
2:
Form1.Color := clBlack; //DeineNeueFarbe
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Bastler Threadstarter
Hält's aus hier
Beiträge: 11
Erhaltene Danke: 1



BeitragVerfasst: 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!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 312
Erhaltene Danke: 7

Windows 7x64
Delphi 7
BeitragVerfasst: Fr 02.03.12 14:32 
Na, das ging aber schnell mit Deiner Antwort :P

Schönes Wochenende :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Perlsau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 59
Erhaltene Danke: 4

Win XP pro
Radstudio 2009 pro
BeitragVerfasst: Fr 02.03.12 17:10 
user profile iconBastler hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Die Tränen, die du nicht weinen willst, müssen andere für dich vergießen. (frei nach: Wer nicht leiden will, muß hassen)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home