Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi hintergrundefekt (https://www.delphipraxis.net/69267-hintergrundefekt.html)

toredo 12. Mai 2006 17:27


hintergrundefekt
 
hay,

wenn man im klassischen anmeldeverfahren bei windows auf start/herunterfahren klickt, wird der hintergrund ja langsam so schwarz/weiss und man kann im hintergrund nichts mehr anklicken.

weiss jemand von euch vielleicht wie man das machen kann?

mfG toredo

Flare 12. Mai 2006 17:57

Re: hintergrundefekt
 
Diese Frage wurde hier schonmal irgendwann gestellt, das ist ein Screenshot, der Scharz-Weiß gemacht wurde und dann lässt Windows das Bild in das Scharz-Weiß-Bild langsam überlaufen.
Dass man nichts drücken kann liegt einfach an Windows, das ist Absicht :zwinker:


Flare

toredo 13. Mai 2006 10:55

Re: hintergrundefekt
 
hay,

ich hab jetzt recht lange gesucht und auch viele stichworte benutzt, aber nichts gefunden, könntest du mir plz den link zu dem thread geben?


mfG toredo

Flare 13. Mai 2006 10:59

Re: hintergrundefekt
 
Ich habe nach "Windows grau" gesucht, einen Thread gefunden der hier hin verwiesen hat, das dürfte das sein :zwinker:


Flare

toredo 13. Mai 2006 11:18

Re: hintergrundefekt
 
thx, ich hab nur herunterfahren, schwarz/weiss und so gesucht aber gerda das was du eingegeben hast ned.^^

in dem thread wird zwar erklärt wie das ganze abläuft, aber nicht wie man das in delphi verwirklichen kann.
so ein kleines code-schnipsel-ding wär shcon ned schlecht.

mfG toredo

Flare 13. Mai 2006 11:34

Re: hintergrundefekt
 
Du hast ja auch nur gefragt wie man das machen kann, nicht nach Code oder ähnlichem ^^

Ich kenne mich nicht mit Bitmpas aus, deswegen kann ich dir nur Vorschläge geben wie man es machen könnte.

Du hast ein Bitmap, und jedes Pixel hat einen Farbwert RGB. Diesen Farbwert musst du Zu einem Grau machen. Also bildest du den Mittelwert von den 3 Farben und machst eben in der ersten Stufe 5% Anpassung an diesen Grauwert, in der 2. Stufe 10% und so weiter. Zwischen den einzelnen Stufen lässt du das Bild immer wieder anzeigen (is ja logisch :mrgreen: ).

Also so würde ich das machen.


Flare

toredo 13. Mai 2006 11:45

Re: hintergrundefekt
 
:-D danke für die gute anleitung :-D

ich verstehs jetzt zimlich, also wies funzt, aber beim verwirklichen hab ich noch probs.

und mit bitmaps kenn ich mich auch ned gut aus (eigentlich kennnn ich mich (noch) mit nichts aus^^).


könnte plz einer der sich gut mit solchen dingen auskennt shcnell helfen?

danke für deine hifle Flare :zwinker:



mfG toredo

xaromz 13. Mai 2006 12:01

Re: hintergrundefekt
 
Hallo,

im Grunde brauchst Du dafür drei Funktionen:
Eine, die ein Graustufenbild erzeugt.
Eine, die zwei Bilder überlagert
Eine, die diese Überlagerung in einer Schleife widerholt.

Ich hab mal diese drei Funktionen geschrieben. Du brauchst nur noch ein TImage und einen Button:
Delphi-Quellcode:
procedure ToGray(const Bitmap: TBitmap);
var
  Trip: PRGBTriple;
  P: PByte;
  PixelCount: Integer;
  C: Integer;
  Gray: Byte;
  Alignment: Byte;
begin
  if not (Bitmap.PixelFormat in [pf24Bit, pf32Bit]) then
    Exit;

  // Vorbereitungen
  P := Bitmap.ScanLine[Bitmap.Height - 1];

  // Alignment berechnen
  if (Bitmap.PixelFormat = pf24Bit) then
    Alignment := (4 - (Bitmap.Width * 3) mod 4) mod 4
  else
    Alignment := 0;

  // In einer Schleife alle Pixel durchgehen
  PixelCount := Bitmap.Width * Bitmap.Height;
  for C := 0 to PixelCount - 1 do
  begin
    //Pixel holen
    Trip := PRGBTriple(P);

    // Graustufenberechnung
    Gray := Round(Trip.rgbtBlue * 0.114 + Trip.rgbtGreen * 0.578 + Trip.rgbtRed * 0.299);
    Trip.rgbtBlue := Gray;
    Trip.rgbtGreen := Gray;
    Trip.rgbtRed := Gray;

    // Nächster Pixel
    Inc(P, 3);
    if Bitmap.PixelFormat = pf32Bit then
      Inc(P);

    // Alignment am Ende der Zeile
    if (C > 0) and (C mod Bitmap.Width = 0) then
      Inc(P, Alignment);
  end;
end;

function Fade(const Bitmap1, Bitmap2: TBitmap; Delta: Byte): TBitmap;
var
  Trip1, Trip2, TripR: PRGBTriple;
  P1, P2, PR: PByte;
  PixelCount: Integer;
  C: Integer;
  Alignment1, Alignment2, AlignmentR: Byte;

begin
  Result := nil;
  if (Bitmap1 = nil) or (Bitmap2 = nil) or
     (Bitmap1.Width <> Bitmap2.Width) or (Bitmap1.Height <> Bitmap2.Height) or
     not (Bitmap1.PixelFormat in [pf24Bit, pf32Bit]) or
     not (Bitmap2.PixelFormat in [pf24Bit, pf32Bit]) then
  Exit;

  // Vorbereiten
  Result := TBitmap.Create;
  Result.PixelFormat := pf24Bit;
  Result.Width := Bitmap1.Width;
  Result.Height := Bitmap1.Height;

  P1 := Bitmap1.ScanLine[Bitmap1.Height - 1];
  P2 := Bitmap2.ScanLine[Bitmap2.Height - 1];
  PR := Result.ScanLine[Result.Height - 1];

  // Alignment berechnen
  if (Bitmap1.PixelFormat = pf24Bit) then
    Alignment1 := (4 - (Bitmap1.Width * 3) mod 4) mod 4
  else
    Alignment1 := 0;

  if (Bitmap2.PixelFormat = pf24Bit) then
    Alignment2 := (4 - (Bitmap2.Width * 3) mod 4) mod 4
  else
    Alignment2 := 0;

  AlignmentR := (4 - (Result.Width * 3) mod 4) mod 4;

  // In einer Schleife alle Pixel durchgehen
  PixelCount := Result.Width * Result.Height;
  for C := 0 to PixelCount - 1 do
  begin
    // Pixel holen
    Trip1 := PRGBTriple(P1);
    Trip2 := PRGBTriple(P2);
    TripR := PRGBTriple(PR);

    // Faden
    TripR.rgbtBlue := Round((Trip1.rgbtBlue * Delta + Trip2.rgbtBlue * (255 - Delta)) / 255);
    TripR.rgbtGreen := Round((Trip1.rgbtGreen * Delta + Trip2.rgbtGreen * (255 - Delta)) / 255);
    TripR.rgbtRed := Round((Trip1.rgbtRed * Delta + Trip2.rgbtRed * (255 - Delta)) / 255);

    // Nächster Pixel
    Inc(P1, 3);
    Inc(P2, 3);
    Inc(PR, 3);
    if Bitmap1.PixelFormat = pf32Bit then
      Inc(P1);
    if Bitmap2.PixelFormat = pf32Bit then
      Inc(P2);

    // Alignment am Ende der Zeile
    if (C > 0) and (C mod Result.Width = 0) then
    begin
      Inc(P1, Alignment1);
      Inc(P2, Alignment2);
      Inc(PR, AlignmentR);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  B1, B2: TBitmap;
  I: Integer;
  Count, Delta: Integer;
begin
  try
    Screen.Cursor := crHourglass;
    // Bilder vorbereiten
    B1 := TBitmap.Create;
    B1.Assign(Image1.Picture.Bitmap);
    B2 := TBitmap.Create;
    B2.Assign(B1);
    ToGray(B2);

    // Die Schleife
    // einfach mal mit den Werten spielen,
    // aber (Count - 1) * Delta darf nicht größer sein als 255!
    Count := 20;
    Delta := 12;
    for I := 0 to Count - 1 do
    begin
      Image1.Picture.Bitmap := Fade(B1, B2, 255 - I * Delta);
      Image1.Update;
    end;
  finally
    B2.Free;
    B1.Free;
    Screen.Cursor := crDefault;
  end;
end;
Gruß
xaromz

toredo 13. Mai 2006 12:11

Re: hintergrundefekt
 
hay,

thx für den code :)
ich hab einfach gemacht, dass man nicht auf nen button klicken muss, sondern, dass das alles am anfang wenn die form1 gemacht wird passieren soll.

aber wenn ich das mache wird logischerweise das bild im TImage dunkler (aber irgendwie ist es einfach ein bisschen grauer und wird ned dunkler?), aber kann ich auch machen, dass der hintergrund dunkler wird?
weil n'TImage kann man ja nicht auserhalb der form hinsetzen^^


mfG toredo

Manne 13. Mai 2006 12:12

Re: hintergrundefekt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Servus,
hab mal vor über einem Jahr damit angefangen eine Komponente zu schreiben, die gerade den XP-Shutdowneffekt nachahmt.
Die Quelltexte sind ziemlich konfus, nicht doukumentiert. Wollte alles "professionell" machen :-D. Vllt. checkst du durch.
Man braucht glaube ich noch folgende
Kopmenenten :-(:
Have Fun

Manne

[edit]Ich idiot sollte die datei auch anhängen :wall: [/edit]

toredo 13. Mai 2006 12:17

Re: hintergrundefekt
 
:mrgreen: klingt kompliziert, ich werds mir aber trozdem anschauen:)



mfG toredo

xaromz 13. Mai 2006 12:19

Re: hintergrundefekt
 
Hallo,
Zitat:

Zitat von toredo
aber wenn ich das mache wird logischerweise das bild im TImage dunkler (aber irgendwie ist es einfach ein bisschen grauer und wird ned dunkler?), aber kann ich auch machen, dass der hintergrund dunkler wird?

Genau, das Bild wird ja mit einer grauen Version seiner Selbst überblendet, also mit jedem Schleifendurchlauf immer grauer.
Wenn Du das Bild dunkler haben willst (was dann nicht mehr der WinXP-Effekt wäre), dann ändere doch einfach die Funktion "ToGray" so ab, dass alle Farben noch etwas dunkler sind, z. B.
Delphi-Quellcode:
...
    //Pixel holen
    Trip := PRGBTriple(P);

    // Graustufenberechnung
    Gray := Round((Trip.rgbtBlue * 0.114 + Trip.rgbtGreen * 0.578 + Trip.rgbtRed * 0.299) * 0.5); // halbe Helligkeit
    Trip.rgbtBlue := Gray;
    Trip.rgbtGreen := Gray;
    Trip.rgbtRed := Gray;

    // Nächster Pixel
...
Zitat:

Zitat von toredo
weil n'TImage kann man ja nicht auserhalb der form hinsetzen^^

Das TImage ist ja nur ein Beispiel. Wo Du Dein Bitmap hernimmst und wo Du dann hinmalst ist natürlich Deine Sache.

Gruß
xaromz

toredo 13. Mai 2006 12:22

Re: hintergrundefekt
 
ok, aber wie kann ich denn ein bild vom hintergrund machen, bzw. es dann später auf dem hintergrund darstellen lassen?

das mit den farben hab ich jetzt auch kapiert:)



mfG toredo

Klaus01 13. Mai 2006 12:32

Re: hintergrundefekt
 
vielleicht eine Form die den ganzen Bildschirm ausfüllt
ohne Rahmen und ohne alles.
Damit kannst Du das dann auch erreichen, daß
niemand mehr in den Hintergrund klicken kann.

Grüße
Klaus

toredo 13. Mai 2006 13:17

Re: hintergrundefekt
 
hm, also ne zweite form wär keine schlechte idee:D

dann muss ich nur noch wissen wie man vom ganzen bildschirm ein pic erstellt bevor die form erscheint, udn dieses pic sollte dann auf die neue form kommen.



mfG toredo

Flare 13. Mai 2006 13:23

Re: hintergrundefekt
 
Du könntest ja ShowMasTa ganz nett fragen ob er dir sagt wie er es gemacht hat.
Den sein Programm läuft ja hier nebenbei als Thread.


Flare

Klaus01 13. Mai 2006 14:42

Re: hintergrundefekt
 
Wie Du einen ScreenShot machen kannst findest Du hier:
http://www.dsdt.info/tipps/?id=316

Grüße
Klaus

toredo 13. Mai 2006 14:50

Re: hintergrundefekt
 
öhm, ich habe grade gemerkt, dass ich die neue form nicht über die taskleiste legen kann...
weiss jemand wie man das machen kann?

und wie kann ich machen, dass ne form nicht "bewegbar" ist, also man kann sie halt ned hin und her schieben und so...



mfG toredo

Klaus01 13. Mai 2006 14:57

Re: hintergrundefekt
 
Du kannst ja die Taskbar verstecken -> http://home.arcor.de/hardcoders/delp...ten/sy_15.html
oder hier -> http://delphi.zsg-rottenburg.de/faq.html oder auch hier -> http://www.patrick-lenger.de/html/delphi/taskleiste.htm

und bitte daran denken, die taskbar wieder sichtbar zu machen, wenn Dein Programm beendet wird.

Wenn Deine Form keine Rahmen hat, kann man sie theoretisch auch nicht bewegen.

Grüße
Klaus

turboPASCAL 13. Mai 2006 16:49

Re: hintergrundefekt
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ein Beispiel:

Delphi-Quellcode:
unit Unit1;

interface

uses
  {$IFDEF VER170}
    XPMan,
  {$ENDIF}
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TFadeThread = class(TThread)
  private
    FParameter: Integer;
  protected
    procedure Execute; override;
  public
    constructor Create(FadeLevel: Integer);
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { Private-Deklarationen }
    bmp: TBitmap;
    Fade: TFadeThread;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TPixRGBArray = Array [0..2] of Byte;
  PPixRGBArray = ^TPixRGBArray;

procedure ScreenCapture(Bitmap: TBitmap);
var
  c: TCanvas;
  r: TRect;
begin
  c := TCanvas.Create;
  c.Handle := GetWindowDC(GetDesktopWindow);
  try
    r := Rect(0, 0, Screen.Width, Screen.Height);
    Bitmap.Width := Screen.Width;
    Bitmap.Height := Screen.Height;
    Bitmap.Canvas.CopyRect(r, c, r);
  finally
    ReleaseDC(0, c.Handle);
    c.Free;
  end;
end;

procedure MakeGray(Bitmap: TBitmap; HowGray : Byte);
var
  x, y: integer;
  R, G, B, h: Byte;
  Pixel: PPixRGBArray;
begin
  if Bitmap.PixelFormat <> pf24bit then
    Bitmap.PixelFormat := pf24bit;

  for y := 0 to Bitmap.height - 1 do
  begin
    Pixel := Bitmap.ScanLine[y];
    for x := 0 to Bitmap.Width - 1 do
    begin
      R := Pixel^[2];
      G := Pixel^[0];
      B := Pixel^[1];

      //h := (r+b+g) div 3;
      h:= HiByte(r * 77 + g * 150 + b * 28);

      Pixel^[2] := h + Round((R - h) / 255 * HowGray);
      Pixel^[0] := h + Round((G - h) / 255 * HowGray);
      Pixel^[1] := h + Round((B - h) / 255 * HowGray);

      inc(Pixel);
    end;
  end;
end;

constructor TFadeThread.Create(FadeLevel: Integer);
begin
  inherited Create(True);  // Create thread as suspended
  FreeOnTerminate := True; // Fire and forget
  Priority := tpNormal;    // the priority
  FParameter := FadeLevel;
end;

procedure TFadeThread.Execute;
var
  fa: integer;
begin
  fa := 255;
  while (fa > FParameter) do
  begin
    if not Terminated then Sleep(2) else Break;
    MakeGray(Form1.bmp, fa);
    Form1.PaintBox1.Canvas.Lock;
    Form1.PaintBox1.Canvas.Draw(0, 0, Form1.bmp);
    Form1.PaintBox1.Canvas.Unlock;
    if fa > 0 then dec(fa);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bmp := TBitmap.Create;
  ScreenCapture(bmp);

  Width := Screen.DesktopWidth;
  Height := Screen.DesktopHeight;

  Panel1.Left := (ClientRect.Right div 2) - (Panel1.Width div 2);
  Panel1.Top := (ClientRect.Bottom div 2) - (Panel1.Height div 2);

  Fade := TFadeThread.Create(196);
  Fade.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.free;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0, 0, bmp);
end;

end.
Warum das "Programm" aber anhält, wenn man es beim faden anklickt ist mir unklar. (Thread ?) :gruebel:

toredo 13. Mai 2006 22:48

Re: hintergrundefekt
 
thx, für das beispiel, ich glaub jetzt sollte ich hinkriegen :-D

danke für die gute und schnelle hilfe.


mfG toredo

turboPASCAL 13. Mai 2006 22:52

Re: hintergrundefekt
 
Soebend ist ein Update gemacht worden. ;)

:hi:

ralfiii 26. Sep 2008 12:40

Re: hintergrundefekt
 
turboPascal, wie kommst du darauf:
Delphi-Quellcode:
      h:= HiByte(r * 77 + g * 150 + b * 28);
Danke,
Ralf


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz