Delphi-PRAXiS
Seite 1 von 3  1 23      

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]


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr.
Seite 1 von 3  1 23      

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