Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 07:55

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Mär 30, 2006 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

man kann ja bei einer TForm einfach AlphaBlending aktivieren und damit das Form z.B. 50% transparent machen.
Gemacht wird das Intern über so nen gelayerten Window Style..

Hat jemand ne idee wie es funktioniert das das Form an verschiedenen stellen verschieden transparent ist?? Gibt ja div. Programme die das können...
Das einfachste wäre wenn ich irgendwie eine art Screenshot von dem bereich hinter meinem Form machen könnte, aber ich zweifle das das geht.. :(

Hat jemand ne idee??

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 15:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Windows ist für so etwas nicht wirklich ausgelegt. Das Einzige was du machen könntest wäre das Bild zu fotographieren bevor du dein Fenster anzeigst. Allerdings sobald sich etwas hinter deinem Fenster ändert hast du gelitten, da sich das nicht anpassen wird. Solche Sachen würde ich maximal nur für einen SplashScreen einsetzen sonst könnte es unter umständen doch ganz schön langsam werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 15:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

aber schau dir mal z.B. Miranda mit diesem Skinning Plugin an... das bekommt problemlos verschieden starke Transparenzen hin die sich auch in echtzeit updaten wenn man das Form bewegt.. also muß es immerhin irgendwie gehen :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 16:08 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
In dem Fall bietet sich deren Quellcode an.
Ansonsten legen die vielleicht andere Komponenten übereinander, sodass die gewünschte Transparenz erreicht wird?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Problemlos halte ich jetzt mal für ein gerücht. Wenn das nicht so scheiße geil aussehen würde hätte ich das definitiv aus. Dadurch ist das Miranda nämlich verdammt langsam geworden.

Das mit dem Bewegen geht. Nehmen wir mal an du hast einen rechtekigen Breich kopiert. Dann verschiebst du diesen Bereich um das was du das Fenster verschieben willst und kopierst den neuen Inhalt an die Stellen die Frei geworden sind. Damit hast du immer einen Hintergrund. Aber wie schaut es aus, wenn sich unter Miranda etwas tut? Bekommen die das auch hin? Also ohne du etwas am Fenster machst! Kann das aber auch gerade nicht ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab's nochmal genauer getestet.. Miranda ist StayOnTop, und wenn ich ein Fenster darunter rumbewege oder sich etwas in dem fenster tut bekommt Miranda das mit :) Selbst wenn im Hintergrund Firefox in dem grad nen GIF-Banner rumblinkt funktioniert das problemlos.. (Wobei ich nen P4D-3Ghz mit GeForce7800GTX hab, evtl ist es dadurch bedingt echtzeit.. aber sooo langsam kann es bei älteren PCs eigentlich auchnet sein)

Bild

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 31, 2006 02:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

im DelphiForum hatte jemand dazu eine VB Datei gepostet die genau das macht was ich wollte.. hab es eben portiert und dachte.. evtl braucht es nochwer :)

Code:
  1. /////////////////////////////////////////////////////
  2. //                                                 //
  3. //  Written by: AyaKoshigaya (March 2006)          //
  4. //                                                 //
  5. //  Mail: Aya@koshigaya.de                         //
  6. //  Website: http://www.Koshigaya.de               //
  7. //                                                 //
  8. /////////////////////////////////////////////////////
  9. unit kSysTransparentForm;
  10.  
  11. interface
  12.  
  13. uses
  14.   Windows, Graphics;
  15.  
  16. function InitTransparentForm: Boolean;
  17. procedure DestroyTransparentForm;
  18. function MakeTransparentForm(FormHandle: hWnd; Width, Height: Integer; imageFilename: PWideChar): Boolean;
  19.  
  20. implementation
  21.  
  22. const
  23.   GdiPlusLib = 'GdiPlus.dll';
  24.  
  25. var
  26.   mDC: Cardinal;
  27.   mainBitmap: Cardinal;
  28.   blendFunc32bpp: BLENDFUNCTION;
  29.   token: Cardinal;
  30.   oldBitmap: Cardinal;
  31.  
  32. type
  33.   DebugEventProc = procedure(Level: Integer; Msg: Pointer); stdcall;
  34.   NotificationHookProc = function(out token: DWord): Integer; stdcall;
  35.   NotificationUnhookProc = procedure(token: DWord); stdcall;
  36.   PGdiplusStartupInput = ^GdiplusStartupInput;
  37.   GdiplusStartupInput = packed object
  38.     GdiplusVersion: UInt;
  39.     DebugEventCallback: DebugEventProc;
  40.     SuppressBackgroundThread: Bool;
  41.     SuppressExternalCodecs: Bool;
  42.     procedure Init(debugEventCB: DebugEventProc = nil; supBackgroundThread: BOOL = false; supExternalCodecs: BOOL = false);
  43.   end;
  44.   PGdiplusStartupOutput = ^GdiplusStartupOutput;
  45.   GdiplusStartupOutput = packed record
  46.     NotificationHook: NotificationHookProc;
  47.     NotificationUnhook: NotificationUnhookProc;
  48.   end;
  49.  
  50. function GdipCreateFromHDC(hDC: HDC; var Graphics: Cardinal): Integer; stdcall; external GdiPlusLib;
  51. function GdipLoadImageFromFile(const fileName: PWideChar; var Image: Cardinal): Integer; stdcall; external GdiPlusLib;
  52. function GdipGetImageWidth(Image: Cardinal; var Width: UINT): Integer; stdcall; external GdiPlusLib;
  53. function GdipGetImageHeight(Image: Cardinal; var Height: UINT): Integer; stdcall; external GdiPlusLib;
  54. function GdipDrawImageRect(Graphics: Cardinal; Image: Cardinal; X, Y, Width, Height: Single): Integer; stdcall; external GdiPlusLib;
  55. function GdipDisposeImage(Image: Cardinal): Integer; stdcall; external GdiPlusLib;
  56. function GdipDeleteGraphics(Graphics: Cardinal): Integer; stdcall; external GdiPlusLib;
  57. function GdiplusStartup(out Token: DWord; const Input: GdiplusStartupInput; Output: PGdiplusStartupOutput): Integer; stdcall; external GdiPlusLib;
  58. procedure GdiplusShutdown(Token: DWord); stdcall; external GdiPlusLib;
  59.  
  60. function InitTransparentForm: Boolean;
  61. var
  62.   GpInput: GdiplusStartupInput;
  63.   GpOutput: GdiplusStartupOutput;
  64. begin
  65.   GpInput.Init;
  66.   Result:=GdiplusStartup(Token, GpInput, @GpOutput) = 0;
  67. end;
  68.  
  69. procedure DestroyTransparentForm;
  70. begin
  71.   GdiplusShutdown(Token);
  72.   SelectObject(mDC, oldBitmap);
  73.   DeleteObject(mainBitmap);
  74.   DeleteObject(oldBitmap);
  75.   DeleteDC(mDC);
  76. end;
  77.  
  78. function MakeTransparentForm(FormHandle: hWnd; Width, Height: Integer; imageFilename: PWideChar): Boolean;
  79. var
  80.   tempBitmap: BITMAPINFO;
  81.   lngHeight, lngWidth: Cardinal;
  82.   curWinLong: Cardinal;
  83.   img: Cardinal;
  84.   graphics: Cardinal;
  85.   winSize: Size;
  86.   srcPoint: TPoint;
  87.   pvBits: Pointer;
  88.   HandleDC: hDC;
  89. begin
  90.   HandleDC:=GetDC(FormHandle);
  91.   Result:=true;
  92.   ZeroMemory(@tempBitmap, sizeof(BITMAPINFO));
  93.   with tempBitmap.bmiHeader do begin
  94.     biSize:=SizeOf(BITMAPINFOHEADER);
  95.     biBitCount:=32;
  96.     biWidth:=Width;
  97.     biHeight:=Height;
  98.     biPlanes:=1;
  99.     biCompression:=BI_RGB;
  100.     biSizeImage:=biWidth * biHeight * 4;
  101.   end;
  102.   mDC:=CreateCompatibleDC(HandleDC);
  103.   mainBitmap:=CreateDIBSection(mDC, tempBitmap, DIB_RGB_COLORS, pvBits, 0, 0);
  104.   oldBitmap:=SelectObject(mDC, mainBitmap);
  105.  
  106.   if GdipCreateFromHDC(mDC, graphics) <> 0 then Result:=false;
  107.   if GdipLoadImageFromFile(imageFilename, img) <> 0 then Result:=false;
  108.   if GdipGetImageWidth(img, lngWidth) <> 0 then Result:=false;
  109.   if GdipGetImageHeight(img, lngHeight) <> 0 then Result:=false;
  110.   if GdipDrawImageRect(graphics, img, 0, 0, lngWidth, lngHeight) <> 0 then Result:=false;
  111.   curWinLong:=GetWindowLong(FormHandle, GWL_EXSTYLE);
  112.   SetWindowLong(FormHandle, GWL_EXSTYLE, curWinLong or WS_EX_LAYERED);
  113.   SetWindowPos(FormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
  114.   srcPoint.X:=0;
  115.   srcPoint.Y:=0;
  116.   winSize.cx:=Width;
  117.   winSize.cy:=Height;
  118.   with blendFunc32bpp do begin
  119.     AlphaFormat:=AC_SRC_ALPHA;
  120.     BlendFlags:=0;
  121.     BlendOp:=AC_SRC_OVER;
  122.     SourceConstantAlpha:=255;
  123.   end;
  124.   if GdipDisposeImage(img) <> 0 then Result:=false;
  125.   if GdipDeleteGraphics(graphics) <> 0 then Result:=false;
  126.   if not UpdateLayeredWindow(FormHandle, HandleDC, nil, @winSize, mDC, @srcPoint, 0, @blendFunc32bpp, ULW_ALPHA) then Result:=false;
  127. end;
  128.  
  129. { GdiplusStartupInput }
  130.  
  131. procedure GdiplusStartupInput.Init(debugEventCB: DebugEventProc; supBackgroundThread, supExternalCodecs: BOOL);
  132. begin
  133.   GdiplusVersion:=1;
  134.   DebugEventCallback:=debugEventCB;
  135.   SuppressBackgroundThread:=supBackgroundThread;
  136.   SuppressExternalCodecs:=supExternalCodecs;
  137. end;
  138.  
  139. end.


InitTransparentForm muß einmal am anfang aufgerufen werden. Liefert true zurück wenn GDI+ verfügbar ist.
MakeTransparentForm immer dann aufrufen wenn das Form transparent gemacht werden soll :)
DestroyTransparentForm beim beenden aufrufen um alle Variablen etc wieder freizugeben.

Vieleicht braucht's ja der ein oder andere irgendwann mal :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 31, 2006 09:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 17, 2005 13:19
Beiträge: 98
Wohnort: Jahnsdorf
@Aya: 3 Fragen:

1. Hast Du rein Zufällig die Quelle für den VB-Source verfügbar?
2. Was machen die Debug-Prozeduren; was bekommt man da für "Meldungen"?
3. Wie sieht's mit der Weiterverwendung in OS-Projekten (GPL\LGPL) aus?

_________________
Administrator of Project Omorphia
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 31, 2006 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

den VB Code etc gibt's hier :)
http://www.delphi-forum.de/topic_HighDe ... 58200.html

Wegen weiterverwendung:
Ich hab den Code ja auch nur Portiert, und bei dem Original war nichts lizenzmäßiges drin..
Auf meinen Delphi Code werd ich nix lizenzmäßiges machen, soll jeder verwenden der will.. :)

PS: Die Debug Meldungen, stimmt.. hab ich vergessen mitzunehmen *g* Stehen aber auch in der VB datei als Enumeration drin.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 23, 2006 10:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
kommt jetzt eventuell etwas spät,
aber prinzipiell ist das über ein LayeredWindow Problemlos machbar.
Einziger nachteil wenn du den WindoStyle auf LayeredWindow stellst ist das du dann ein großes Problem mit normalen VCL Komponenten bekommst, die siehst du nämlich nicht mehr ;)

Ich nutze das ganze aber schon länger in Verbindung mit Graphics32,
dort hatte ich mal in der Newsgroup ein Beispiel gefunden welches ein TBitmap32 ganz einfach als LayeredWindow "umwandelt". Dabei werden die Alpha Werte des Bitmaps komplett übernommen und man kriegt nette Effekte hin :)

Wenn noch Bedarf besteht kann ich den Code gerne posten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 23, 2006 13:50 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Lässt sich die Graphics32 auch mit fpc kompilieren?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 23, 2006 15:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Hab ich nie selbst probiert,
auf der Website findet sich dazu aber leider nix.
Kylix/CLX wird soweit ich weiß aber unterstützt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 10, 2007 20:20 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
der Beitrag ist zwar jetzt schon n bissel älter aber Billi, kannst du den Code mal posten? würd mich interessieren!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 12, 2007 14:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
http://svn.sourceforge.net/viewvc/sharp ... iew=markup

für dich interessant:
Zeile 194: procedure TSharpEMenuWnd.UpdateWndLayer;
Zeile 256ff: procedure TSharpEMenuWnd.FormCreate(Sender: TObject);

Hab gerade leider nicht die Zeit mehr dazu zu schreiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 13, 2007 09:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
aso...das ist so ca. das selbe was ich im Moment mach...
ich kriegs allerdings einfach nicht hin die Komponenten zu zeichnen...bis jetzt sieht das ganze so aus
Bild

aber da fehlt halt jegliche Interaktion. Im Moment starte ich den Versuch die WindowProcs der Komponenten zu überschreiben aber weiß nicht genau ob ich da auf dem richtigen Weg bin :?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]