![]() |
AW: Farbänderung in Delphi
Ich empfinde es in aller Regel zudem als "Übergriff", wenn ein Programm meint, es müsse sich nicht an den Standard halten, den ich systemweit selbst vorgebe. Wenn ich meine Titelleisten Gelb haben will, soll sich bitte auch jedes Programm bitteschön daran halten. Wenn das nicht zum Programm-Design passt, liegt das mit großer Wahrscheinlichkeit daran, dass das Programm selbst ebenfalls sämtliche Standards ignoriert, und versucht sein eigenes "stylisches" Süppchen auf den Herd zu stellen. Ich hasse das!!
GUI-Standards sind nicht ohne Grund da, und sind ein absolut wesentlicher Bestandteil der Usability eines PCs. Ja, auch so etwas profanes wie Farben zählen dazu. Windows ist hier sogar gar nicht so sehr rigoros, man hat durchaus viel Gestaltungsfreiheiten. (Man vergleiche mal mit iOS z.B.) Es gibt noch einen Aspekt: Die Standard GUI-Elemente sind flott, weil direkt vom System verwaltet und optimiert. Jeder, der meint er müsse einen dämlichen Farbverlauf als Titelleistenhintergrund haben, kostet mich Leistung. Das mag bei kleinen Progrämmchen egal sein, aber es wäre nicht das erste Mal, dass mir ein Programm mit "schlabberigem" Neuzeichnen den Workflow versaut hat. (Consumer Video-Editing Tools sind da ganz groß drin!) Besser, man gewöhnt sich seine "Stylesucht" so schnell wie möglich wieder ab. Funktion und Usability sind 10000% wichtiger als cooles Eyecandy, und ein gut durchdachtes Design im Rahmen der jeweiligen Standards kann problemlos auch sehr schnittig aussehen. Von daher: Lass den Quark. |
AW: Farbänderung in Delphi
Ich habe das in einem Spiel einmal so gelöst.
Falls ich beim Kopieren irgendein Detail vergessen habe: Sorry.
Delphi-Quellcode:
In Deklaration der Form:
type
TCaptionState=(csNothing,csWon,csLost,csEnd,csWarn,csInfo); // Farben der Window-Caption TCaptionColor=Record BK1:TColor; BK2:TColor; FC:TColor; End; TCaptionColors=Array[TCaptionState] of TCaptionColor; const CaptionColors:TCaptionColors= ((BK1:$6A240A; BK2:$F0CAA6; FC:clWHite) // csNothing ,(BK1:clGreen; BK2:clYellow; FC:clWhite) // csWon ,(BK1:clRed; BK2:clYellow; FC:clWhite) // csLost ,(BK1:$FF8700; BK2:clYellow; FC:clWhite) // csEnd ,(BK1:clYellow; BK2:clRed; FC:clRed) // csWarn ,(BK1:clYellow; BK2:$00E948; FC:clBlack)); // csInfo
Delphi-Quellcode:
Im implementation TeilCaptionState:TCaptionState; PROCEDURE WMNCPAINT(var Msg:TMessage); message WM_NCPAINT; PROCEDURE WMNCACTIVATE(var Msg: TWMNCActivate); message WM_NCACTIVATE; PROCEDURE CMTEXTCHANGED(var Msg:TMessage); message CM_TEXTCHANGED; PROCEDURE DrawCaption;
Delphi-Quellcode:
PROCEDURE TMain.WMNCPAINT(var Msg:TMessage);
begin inherited; DrawCaption; end;
Delphi-Quellcode:
PROCEDURE TMain.WMNCACTIVATE(var Msg:TWMNCActivate) ;
begin inherited; if Msg.Active then DrawCaption; end;
Delphi-Quellcode:
PROCEDURE TMain.CMTEXTCHANGED(var Msg:TMessage);
begin inherited; DrawCaption; end;
Delphi-Quellcode:
Eine Farbänderung wird erreicht, indem CaptionState auf den gewünschten Wert gesetzt und Caption ein anderer Text zugeordnet wird.
PROCEDURE TMain.DrawCaption;
var FH,FW,CH,IH,IW,BW,X,Y:Integer; Bmp:TBitMap; Canvas:TCanvas; R:TRect; Metrics:TNONCLIENTMETRICS; begin if WindowState=wsMinimized then Exit; if CaptionState=csNothing then Exit; Canvas:=TCanvas.Create; Canvas.Handle:=GetWindowDC(Self.Handle); CH:=GetSystemMetrics(SM_CYCAPTION)-1; // Unten scheint ein Pixel zu fehlen BW:=3*GetSystemMetrics(SM_CXSize); // W Buttons // Rect der Caption, abzüglich der Minimize,Maximize,Close Buttons definieren if WindowState=wsMaximized then begin SetRect(R,0,0,Width-BW,CH); end else begin FH:=GetSystemMetrics(SM_CYFRAME); FW:=GetSystemMetrics(SM_CXFRAME); SetRect(R,FW,FH,Width-FW-BW,FH+CH); end; // Icon in Bitmap kopieren IH:=GetSystemMetrics(SM_CYSMICON); // H Icon IW:=GetSystemMetrics(SM_CXSMICON); // W Icon Bmp:=TBitMap.Create; Bmp.Width:=IW; Bmp.Height:=IH; X:=R.Left+2; Y:=(R.Top+R.Bottom-IH) div 2; BitBlt(Bmp.Canvas.Handle,0,0,IW,IH,Canvas.Handle,X,Y,srccopy); // Canvas Hintergrund zeichen with CaptionColors[CaptionState] do GradientFillCanvas(Canvas,BK1,BK2,R,gdHorizontal); // Icon zeichnen Canvas.Draw(X,Y,Bmp); // Caption Text zeichnen Inc(R.Left,2+IW+4); Dec(R.Right,4); Metrics.cbSize:=SizeOf(TNONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS,Metrics.cbSize,@Metrics,0); Canvas.Font.Height:=Metrics.lfCaptionFont.lfHeight; Canvas.Font.Style:=[fsBold]; Canvas.Font.Color:=CaptionColors[CaptionState].FC; Canvas.Brush.Style:=bsClear; Y:=(R.Top+R.Bottom-Canvas.TextHeight(' ')) div 2; Canvas.TextRect(R,R.Left,Y,Caption); // Aufräumen ReleaseDC(Self.Handle,Canvas.Handle); Canvas.Free; Bmp.Free; end; Das zuweisen eines neuen Textes löst dann ein CM_TEXTCHANGED aus. |
AW: Farbänderung in Delphi
Zitat:
Zitat:
Zitat:
Aber wir schweifen wieder ab ... |
AW: Farbänderung in Delphi
Zitat:
Ich betreue u.a. eine Anwendung, die mit den DevExpress-Sytels arbeitet. Und diese Styles erfreuen sich bei den Anwendern höchster Beliebtheit. Mir selbst ist ein klassisches Design auch lieber, aber wenn Du schon das Stichwort "Usability" in den Raum wirfst: Hier ist doch stets die zentrale Frage "Für wen gut benutzbar"? zu stellen. Es gibt so viele Umgebungen, in denen Buttons größer, Labels größer, Farben deutlich sprechend ein müssen. Manchmal auch nur, weil diese Farben im Kontext eines Unternehmens eine gewisse Bedeutung erlangt haben, die jeder kennt und versteht. Solange man nichts Besseres weiß bzw. keine anderen Vorgaben hat, ist es bestimmt ein guter Rat, sich an die jeweiligen Standards des OS zu halten. Nur aus Prinzip und ggf. wider besseren Wissens würde ich das nicht tun. Das ist und bleibt die Entscheidung des Entwicklers, um auf die Bedürfnisse des Anwenders einzugehen. Dann erst entsteht "Usability". |
AW: Farbänderung in Delphi
Zitat:
Oder - und auch das ist legitim - man klickt einfach weiter. |
AW: Farbänderung in Delphi
+1
_ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz