| Autor |
Beitrag |
CarpeDiem
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Di 01.04.08 16:56
Hallo, ich habe den aktuellen Destkop mit allen Fenstern und Icons in ein Bitmap weggesichert und zwar mit dem Quellcode des folgenden Links:
[url] www.delphi-library.d...shot%20desktop[/url].
Jetzt würde ich gerne das Bild des Desktops so anzeigen, als ob dieser hinter einer Glasscheibe ist. Hat vielleicht jemand eine Idee? Vielleicht so ne Art Blau-Effekt. Danke gleich mal für alle Bemühungen. 
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
xqz93
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 01.04.08 17:51
 Link ist Defekt
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Di 01.04.08 18:07
Titel: Neuer Link
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
Fabian E.
      
Beiträge: 554
Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
|
Verfasst: Di 01.04.08 19:05
also ich habe soetwas schon mal anders realisiert...
ich habe eine bsNone maximierte From genommen und sie komplett durchsichtig gemacht.
die habe ich dann über den desktop gelegt. natürlich ist das ganze ziemlich prozessorlastig, aber da das ganze als computersperre dienen soll, ist das egal.
gruß
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Di 01.04.08 19:17
Danke, dachte ich auch schon. Ist nur schlecht, daß die Zeit weiter läuft. Müsste man halt den Desktop wegsichern, dann über das Formular, das den Desktop zeichnet wieder eine halbtransparente Form legen. Wollte allerdings noch nen Blaustich mit rein, so, daß es wie eine Glassscheibe aussieht und nicht wie eine Milchglassscheibe.
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 01.04.08 19:26
Färbe deine Form mit dem gewünschten Blauton und stelle AlphaBlend auf True und AlphaBlendValue auf einen ganz niedrigen Wert. Dann brauchst du keinen Screenshot und die Zeit läuft unter der Form ganz normal weiter. Auch animierte Symbole im Tray-Bereich bewegen sich noch schön
Das hier find ich ganz gut:
Delphi-Quelltext 1: 2:
| Color = $00F9D2A4; AlphaBlendValue = 100; |
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Di 01.04.08 20:05
Jupp...schaut gar nicht so übel aus. Danke.
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Mi 02.04.08 10:13
Titel: Performance-Problem
Hallo, ich habe jetzt mal den Quellcode für das Alphablending selber geschrieben. Und zwar folgendermaßen. Ich mache einen Desktop-Screenshot, kopiere diesen in ein Bitmap-Objekt. Lege dann ein zweites Bitmap-Objekt an, in diesem ziehe ich ein blaues Rechteck über den gesamten Bereich(Monitor-Auflösungs-Größe). Im folgenden Quellcode ist das untere Bild der Desktop und das obere Bild das blaue Rechteck-Bitmap. Leider ist der Quellcode wahnsinnig langsam. Benötigt für Bildschirmauflösung 1400x1050 ca. 35 Sek.!!!  Ich möchte jetzt noch Scheibenrisse einfügen, die den Desktop wieder sichtbar machen, deswegen selber programmieren. 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: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82:
| int Startzeit = GetTickCount();
Graphics::TBitmap *Bitmap = new Graphics::TBitmap(); Graphics::TBitmap *BitmapAlphablending = new Graphics::TBitmap();
HANDLE DC;
DC = GetDC(0);
Bitmap->Width = Screen->Width; Bitmap->Height = Screen->Height; BitmapAlphablending->Width = Screen->Width; BitmapAlphablending->Height = Screen->Height;
BitBlt(Bitmap->Canvas->Handle, 0,0,Screen->Width,Screen->Height, DC, 0,0, SRCCOPY );
BitmapAlphablending->Canvas->Pen->Color = (TColor)RGB(0,0,255); BitmapAlphablending->Canvas->Pen->Style = psSolid; BitmapAlphablending->Canvas->Brush->Color = (TColor)RGB(0,0,255); BitmapAlphablending->Canvas->Brush->Style = bsSolid;
BitmapAlphablending->Canvas->Rectangle(0,0,BitmapAlphablending->Width-1,BitmapAlphablending->Height-1);
BitmapAlphablending->Canvas->Pen->Color = (TColor)0; BitmapAlphablending->Canvas->Pen->Style = (TPenStyle)0; BitmapAlphablending->Canvas->Brush->Color = (TColor)0; BitmapAlphablending->Canvas->Brush->Style = (TBrushStyle)0;
ReleaseDC(0,DC);
BYTE Alphawert = 192; BYTE oben[65536]; BYTE unten[65536];
for (int mask = 0; mask < 256; mask++) { for (int farbe = 0; farbe < 256; farbe++) { oben[(mask << 8) + farbe] = (farbe * (mask+1)) >> 8; unten[(mask << 8) + farbe] = (farbe * (256-mask)) >> 8; } }
for (int x=0; x<Bitmap->Width; x++) { for (int y=0; y<Bitmap->Height; y++) { Bitmap->Canvas->Pixels[x][y] = (TColor)RGB( oben[(Alphawert << 8) + GetRValue(BitmapAlphablending->Canvas->Pixels[x][y])] + unten[(Alphawert << 8) + GetRValue(Bitmap->Canvas->Pixels[x][y])], oben[(Alphawert << 8) + GetGValue(BitmapAlphablending->Canvas->Pixels[x][y])] + unten[(Alphawert << 8) + GetGValue(Bitmap->Canvas->Pixels[x][y])], oben[(Alphawert << 8) + GetBValue(BitmapAlphablending->Canvas->Pixels[x][y])] + unten[(Alphawert << 8) + GetBValue(Bitmap->Canvas->Pixels[x][y])] ); } }
Image_Startseite->Picture->Assign(Bitmap);
delete Bitmap; delete BitmapAlphablending;
ShowMessage(GetTickCount()-Startzeit); | Wie kann ich die Performance steigern? Danke wieder mal.
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 02.04.08 10:34
Indem du nicht das ultralangsame Pixels-Array sondern Scanline benutzt  .
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Mi 02.04.08 10:47
Versuche ich schon seit ich diesen Beitrag geschrieben habe, aber ich bekomme immer eine Compiler-Meldung "Aufruf einer Nicht-Funktion". C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| int *arrx_unten = new int[Screen->Width]; int *arrx_oben = new int[Screen->Width]; for (int y=0; y<Bitmap->Height; y++) { arrx_unten = Bitmap->ScanLine(y); arrx_oben = BitmapAlphablending->ScanLine(y); for (int x=0; x<Bitmap->Width; x++) { Bitmap->Canvas->Pixels[x][y] = (TColor)RGB( oben[(Alphawert << 8) + GetRValue(arrx_oben[x])] + unten[(Alphawert << 8) + GetRValue(arrx_unten[x])], oben[(Alphawert << 8) + GetGValue(arrx_oben[x])] + unten[(Alphawert << 8) + GetGValue(arrx_unten[x])], oben[(Alphawert << 8) + GetBValue(arrx_oben[x])] + unten[(Alphawert << 8) + GetBValue(arrx_unten[x])] ); } } | Kannst Du mir sagen, wo der Fehler liegt? 
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 02.04.08 11:36
ScanLine ist eine Array-Eigenschaft, muss also mit eckigen Klammern angesprochen werden.
Das Pixelformat sollte man auch noch setzen glaube ich.
Ob das ansonsten korrekt ist, bin ich mir gerade nicht so sicher, ich habe ScanLine in C noch nie benutzt.
Und du solltest das nicht Pixels schreiben sondern wieder direkt in den Speicher...
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 02.04.08 11:38
ich weiß das ist jetzt pures OT aber warum ist das im Delphi-Forum?? sollte das nicht eher im C#-Forum sein oder hab ich was bei meinen eistellungen herumgepfuscht das beides in einem angezeigt wird??
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Mi 02.04.08 12:48
Nein, Du hast schon recht, daß es nicht Delphi ist, aber da ich mit Borland/CodeGear programmiere und Delphi auch von Borland/CodeGear ist, sind viele Beispiele hier nicht nur ähnlich, sondern auch identisch, bis auf die Syntax(z.B. "." statt "->") natürlich. Ansonsten habe ich bei weitem kein so gut moderiertes Forum für C++ gefunden, bzw. die Fragen werden super schnell beantwortet. Also entschuldige bitte im Voraus, aber ich frag lieber hier nach.
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 02.04.08 13:12
Ich weiß nicht, wo der große Unterschied zwischen C++ und C# liegt, aber ich denke, im C-Sharp-Forum wäre C++ passender als im Delphi-Forum.
Back To Topic:
- Lade dir PNG Delphi herunter
- Installiere es
- Erstelle ein Form ohne Alpha-Blending Transparent-Farbe
- Füge eine Align=alScreen-Bitmap ein
- Füge ein Align=alScreen-PNGObject ein
- Lade in das PNG-Objekt dein Alpha-Blend-Image
- Quellcode: Erstelle den Screenshot und speichere ihn in der Bitmap
- Fertig!
|
|
CarpeDiem 
      
Beiträge: 128
WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
|
Verfasst: Mi 02.04.08 13:19
Danke Yogu!
_________________ Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 02.04.08 13:27
stefan.gayr hat folgendes geschrieben: | | Nein, Du hast schon recht, daß es nicht Delphi ist, aber da ich mit Borland/CodeGear programmiere und Delphi auch von Borland/CodeGear ist, sind viele Beispiele hier nicht nur ähnlich, sondern auch identisch, bis auf die Syntax(z.B. "." statt "->") natürlich. Ansonsten habe ich bei weitem kein so gut moderiertes Forum für C++ gefunden, bzw. die Fragen werden super schnell beantwortet. Also entschuldige bitte im Voraus, aber ich frag lieber hier nach. |
schon ok, nichts zu entschuldigen, ich hab mich nur die ganze zeit gewundert warum da im DF C-Code herumschwirrt.
is verständlich das du lieber in nem kompetenten forum nachfragen willst.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 02.04.08 16:25
Yogu hat folgendes geschrieben: | | Ich weiß nicht, wo der große Unterschied zwischen C++ und C# liegt, aber ich denke, im C-Sharp-Forum wäre C++ passender als im Delphi-Forum. |
Nein, ist es nicht. CodeGear C++ nutzt ebenfalls die VCL (bzw. kann sie nutzen), was C# nicht tut. Daher sind die Antworten für Delphi, wie Stefan richtig sagte, oft auch für CodeGear C++ gültig. Außerdem haben C# und C++ nicht so viel gemeinsam, wenn man mal von den geschweiften Klammern absieht. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|