Autor Beitrag
CarpeDiem
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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



BeitragVerfasst: Di 01.04.08 17:51 
:arrow: Link ist Defekt
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 554

Windows 7 Ultimate
Visual Studio 2008 Pro, Visual Studion 2010 Ultimate
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 :D

Das hier find ich ganz gut:

ausblenden Delphi-Quelltext
1:
2:
Color = $00F9D2A4;
AlphaBlendValue = 100;
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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.!!! :cry: Ich möchte jetzt noch Scheibenrisse einfügen, die den Desktop wieder sichtbar machen, deswegen selber programmieren.
ausblenden volle Höhe C#-Quelltext
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:
  // Startzeit
  int Startzeit = GetTickCount();

  // Bitmap-Objekte anlegen
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
  Graphics::TBitmap *BitmapAlphablending = new Graphics::TBitmap();

  // Handle für Device Context
  HANDLE DC;

  // Desktop holen
  DC = GetDC(0);

  // Attribute Bitmap-Objekt
  Bitmap->Width = Screen->Width;
  Bitmap->Height = Screen->Height;
  BitmapAlphablending->Width = Screen->Width;
  BitmapAlphablending->Height = Screen->Height;

  // Desktop in das Bitmap kopieren
  BitBlt(Bitmap->Canvas->Handle,
         0,0,Screen->Width,Screen->Height,
         DC,
         0,0,
         SRCCOPY
    );

  // Rechteck-Attribute für Bitmapalphablending setzen
  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;

  // Rechteck für Bitmapalphablending aufziehen
  BitmapAlphablending->Canvas->Rectangle(0,0,BitmapAlphablending->Width-1,BitmapAlphablending->Height-1);

  // Rechteck-Attribute für Bitmapalphablending rücksetzen
  BitmapAlphablending->Canvas->Pen->Color = (TColor)0;
  BitmapAlphablending->Canvas->Pen->Style = (TPenStyle)0;
  BitmapAlphablending->Canvas->Brush->Color = (TColor)0;
  BitmapAlphablending->Canvas->Brush->Style = (TBrushStyle)0;

  // Speicher Handle für Device Context freigeben
  ReleaseDC(0,DC);

  // Deklaration Alphablending
  BYTE Alphawert = 192;
  BYTE oben[65536];
  BYTE unten[65536];

  // Alphablending-Maske
  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;
    }
  }

  // Alphablending: Bitmaps übereinanderlegen
  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])]
          );
      }
    }

  // Bitmap ins Image kopieren
  Image_Startseite->Picture->Assign(Bitmap);

  // Speicher Bitmap-Objekte wieder freigeben
  delete Bitmap;
  delete BitmapAlphablending;


  // Verbrauchte Zeit in [ms] anzeigen
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 02.04.08 10:34 
Indem du nicht das ultralangsame Pixels-Array sondern Scanline benutzt ;-).
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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".
ausblenden 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? :oops:

_________________
Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:
  1. Lade dir PNG Delphi herunter
  2. Installiere es
  3. Erstelle ein Form ohne Alpha-Blending Transparent-Farbe
  4. Füge eine Align=alScreen-Bitmap ein
  5. Füge ein Align=alScreen-PNGObject ein
  6. Lade in das PNG-Objekt dein Alpha-Blend-Image
  7. Quellcode: Erstelle den Screenshot und speichere ihn in der Bitmap
  8. Fertig!
CarpeDiem Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 128

WIN XP
Borland C++ 2002, CodeGear C++ 2007, C# (VS 2008)
BeitragVerfasst: Mi 02.04.08 13:19 
Danke user profile iconYogu!

_________________
Stefan - Carpe Diem
Es ist keine Schande zu fallen, eine Schande ist nur nicht wieder aufzustehen
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mi 02.04.08 13:27 
user profile iconstefan.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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 02.04.08 16:25 
user profile iconYogu 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".