Autor | Thema: Transparenz und co | | Datum:25.02.02 21:50 
(mischabrandt@gmx.de) | |
Hallo!
1. Wie kann ich den Inhalt eines von mir mittels API erstellen DCs transparent auf %HDC kopieren.
Mittels Bitblt und Stretchblt habe ich es bislang nur rechteckig hinbekommen. Ich habe zwar in der API-Hilfe was von Masken-Funktionen gelesen, aber daraus bin ich nicht sonderlich schlau geworden.
2. Wie lese ich aus einem DC Breite und Höhe aus?
Ein möglichst 'unkomplizierter' Weg wäre hilfreich. Bin zwar kein Anfänger, aber lääääängst kein Profi.
Danke im voraus!
Mischa
|
| | Datum:25.02.02 22:29 
(frankabbing@12move.de) | |
Hallo,
;-)
1. ProSpeed.dll verwenden oder deinen DC in die MemoryBitmap von Profan kopieren und von dort aus transparent auf den Hauptschirm.
2. GetObject() oder GetDIBits()
Gruß, Frank
|
| | Datum:25.02.02 22:53 
| |
Ha, Ha, Frank! ;-)
Danke für die Antwort!
-aber nochmals zu Punkt 1:
Das war mir schon klar!
Das hilft mir aber wenig, wenn ich das von extern durch 'meine' Dll erledigen möchte. Hab' mich möglicherweise auch nicht präzise genug ausgedrückt. :-)
Also, wie geht denn das nu' (über API!) ??? *g*
Wer weiß es..Wer weiß es..?
Mischa
|
| | Datum:25.02.02 23:07 
(frankabbing@12move.de) | |
Hallo,
ab Windows98 gibt es hierfür eine spezielle Funktion, komm' nicht auf den Namen, BitBltTrans() oder so ähnlich, funktioniert aber nicht mit Windows95 !
Ab Windows 95 muß du des öfteren BitBlt() mit speziellen RasterOperationCodes aufrufen, Roland hatte da mal eine alte Delphi-Vorlage, die ich selber auch verwendet habe, mußt ihn mal fragen.
Wenn du Assembler kannst, kann ich dir meinen Code schicken, werd' allerdings selber kaum noch draus schlau. Ist doch schon recht anspruchsvoll !!! Und nicht mal eben programmiert...
Gruß, Frank
|
| | Datum:25.02.02 23:35 
| |
Hallo Frank!
Ich bin ja auch blöd, hätt' ja mal in der API-Hilfe unter Transparent schauen können. Da stehts ja ganz fett!
(Obwohl ich ganz sicher bin, das daß bei meinem letzten Durschauen da noch nicht gestanden hat..hm..werde mal die Funktionen nachzählen :)
Heißt übrigens 'TransparentBlt'. :-)
Ich werds damit mal probieren.
Danke Dir!
Mischa
PS: Assembler kann ich nicht
|
| | Datum:26.02.02 12:04 
(schmidts@flat2serv.de) | |
Hallo,
in der Installation vom PrfPad (http://www.prfpad.de) befindet sich im Unterverzeichnis "Vorlagen" der entsprechende Quellcode:
"
' PROFAN²-NT-TEAM-Vorlage
' Autor: Sven Schmidts, concept/design
' Titel: Transparent Window @ Win2k
' Beschreibung: Sorgt für diesen "netten" Effekt; Transparente Fenster unter Windows 2000
' Copyright © 2000-2001 Sven Schmidts, schmidts@cdesign.de
'
' Powered by PRF-Pad
def %LWA_ALPHA $2
def %GWL_EXSTYLE -20
def %WS_EX_LAYERED $80000
def %WS_EX_TRANSPARENT $20
def SetWindowLong(3) !"USER32","SetWindowLongA"
def GetWindowLong(2) !"USER32","GetWindowLongA"
def SetLayeredWindowAttributes(4) !"USER32","SetLayeredWindowAttributes"
Proc SetTransparent
Declare Old&
Parameters Hwnd%, Perc%
Old& = GetWindowLong(Hwnd%,%GWL_EXSTYLE)
SetWindowLong(Hwnd%, %GWL_EXSTYLE, @Or(Old&,%WS_EX_LAYERED));
SetLayeredWindowAttributes(Hwnd%, 0, (255 * Perc%) / 100, %LWA_ALPHA);
EndProc
''cls
''SetTransparent %Hwnd, 80
''WaitInput
"
Mfg.
Sven Schmidts
|
| | Datum:26.02.02 17:28 
| |
Hi Sven!
Dankeschön für die Vorlage. Allerdings hat dies nichts mit meiner Ausgangsfrage zu tun ;-). (Es ging darum eine mittels API erstellte Speicher-Bitmap mit 'transparenter' Farbe in die sichtbare Bitmap '%HDC' des Profan-Programms zu kopieren. Dein Quellcode ist aber so weit ich weiß dafür gedacht ein ganzez Fenster 'durchsichtig' zu machen.
Und leider, leider funktioniert die 'SetLayeredWindowAttributes'-Funktion auch nur mit W2000, bzw XP, wie Du ja im Kopf des Quelltextes schon erwähnt hast.
Die Windows-Versions-Einschränkungen sind aber auch bei der 'TransparentBlt' - Geschichte ein Ärgernis.
'TransparentBlt' - msimg32.dll geht erst ab 98 und taucht wohl deshalb auch nicht in der Win32.hlp auf.
(Ich habe mich also nicht geirrt..:-)
Im API-Guide ist sie aber dokumentiert.
'GdiTransparentBlt - gdi32.dll scheint in der Funktionsweise identisch zu sein läuft aber wieder erst ab W2000!
Hmmpff! Um eine volle Kompatiblität zu erreichen muß man dann wohl doch wieder 'zu Fuß' programmieren und kann die Hoffnung auf eine bequeme 'Einzeiler'-Lösung verwerfen.
Fazit: Ich werde mich denn dann wohl erst mal mit den RasterOperationCodes von Bitblt rumschlagen.
Mischa
|
| | Datum:27.02.02 09:21 
(andreas@andreas-miethe.de) | |
Hallo Mischa,
hier ein Beispiel :
Gruss
Andreas
'-----------------------------------------------------
DEF LoadImage(6) ! "USER32","LoadImageA"
DEF SelectObject(2) ! "GDI32","SelectObject"
DEF DeleteObject(1) ! "GDI32","DeleteObject"
DEF DeleteDC(1) ! "GDI32","DeleteDC"
DEF BitBlt(9) ! "GDI32","BitBlt"
DEF CreateCompatibleBitmap(3) ! "GDI32","CreateCompatibleBitmap"
DEF CreateCompatibleDC(1) ! "GDI32","CreateCompatibleDC"
DEF CreateBitmap(5) ! "GDI32","CreateBitmap"
DEF SetBkColor(2) ! "GDI32","SetBkColor"
DEF SetMapMode(2) ! "GDI32","SetMapMode"
DEF GetMapMode(1) ! "GDI32","GetMapMode"
Declare HdcTemp&,HdcBack&,HdcObject&,HdcMem&,HdcSave&
Declare BmpAndBack&,BmpAndObject&,BmpAndMem&,BmpSave&
Declare BmpBackOld&,BmpObjectOld&,BmpMemOld&,BmpSaveOld&
Declare BitmapHandle&,Filename$
Declare TransColor&,CColor&
Declare BMPWidth&,BMPHeight&
Declare BitmapInfo#
SetTrueColor 1
Cls RGB(192,192,192)
Loadbmp @LOADFILE$("Hintergrund:","*.bmp"),0,0;0
TransColor& = RGB(255,0,0)
Filename$ = @LOADFILE$("Vordergrund:","*.bmp")
'BitmapDimensionen auslesen
Dim BitmapInfo#,54
Assign #1,Filename$
OpenRW #1
@BlockRead(#1,BitmapInfo#,0,54)
CloseRW #1
BMPWidth& = Long(BitmapInfo#,18)
BMPHeight& = Long(BitmapInfo#,22)
Dispose BitmapInfo#
Declare fbmp&
'Bitmap laden
BitmapHandle& = LoadImage(0,Addr(Filename$),0,0,0,$50)
'temporaerDC anlegen
HdcTemp& = CreateCompatibleDC(%hdc)
'geladenes Bitmap in temporaerDC
SelectObject(HdcTemp&,BitmapHandle&)
'ein paar Speicher-DC's anlegen
HdcBack& = CreateCompatibleDC(%hdc)
HdcObject& = CreateCompatibleDC(%hdc)
HdcMem& = CreateCompatibleDC(%hdc)
HdcSave& = CreateCompatibleDC(%hdc)
'Bitmaps anlegen
'monochrom DC
BmPAndBack& = CreateBitmap(BMPWidth&,BMPHeight&,1,1,0)
BmPAndObject& = CreateBitmap(BMPWidth&,BMPHeight&,1,1,0)
'farbe
BmPAndMem& = CreateCompatibleBitmap(%hdc,BMPWidth&,BMPHeight&)
BmPSave& = CreateCompatibleBitmap(%hdc,BMPWidth&,BMPHeight&)
SetMapMode (HdcTemp&,GetMapMode(%hdc))
'jedes Speicher-DC muss ein Bitmap selektieren zum Speichern der Daten
BmpBackOld& = SelectObject(HdcBack&,BmPAndBack&)
BmpObjectOld& = SelectObject(HdcObject&,BmpAndObject&)
BmpMemOld& = SelectObject(HdcMem&,BmpAndMem&)
BmpSaveOld& = SelectObject(HdcSave&,BmpSave&)
'Bitmaps sichern weil es ueberschrieben wird
BitBlt (HdcSave&,0,0,BMPWidth&,BMPHeight&,HdcTemp&,0,0,$0CC0020)
'Transparenz-Farbe fuer temporaerDC setzen
CColor& = SetBkColor(HdcTemp&,TransColor&)
'Eine Object-Maske anlegen fuer das Bitmaps anlegen
'Von QuellBitmap in Monochrom-Bitmap
BitBlt (HdcObject&,0,0,BMPWidth&,BMPHeight&,HdcTemp&,0,0,$0CC0020)
'Hintergrundfarbe fuer temoraerDC ist weiss
SetBkColor (HdcTemp&,rgb(255,255,255))
'Object-Maske invertieren
BitBlt (HdcBack&,0,0,BMPWidth&,BMPHeight&,HdcObject&,0,0,$0330008)
'HDC-Hintergrund ins MemoryDC kopieren
BitBlt (HdcMem&,0,0,BMPWidth&,BMPHeight&,%hdc,0,0,$0CC0020)
'Bereich maskieren in dem das Bitmaps erscheint
BitBlt (HdcMem&,0,0,BMPWidth&,BMPHeight&,HdcObject&,0,0,$08800C6)
'transparenten Bereich maskieren
BitBlt (HdcTemp&,0,0,BMPWidth&,BMPHeight&,HdcBack&,0,0,$08800C6)
'XOR Bitmap mit Hintergrund HDC
BitBlt (HdcMem&,0,0,BMPWidth&,BMPHeight&,HdcTemp&,0,0,$0EE0086)
'transparentes Bitmap in HDC kopieren
BitBlt (%hdc,0,0,BMPWidth&,BMPHeight&,HdcMem&,0,0,$0CC0020)
'und ins Speicher-HDC kopieren
BitBlt (%hdc2,0,0,BMPWidth&,BMPHeight&,HdcMem&,0,0,$0CC0020)
'Speicher-Bitmaps freigeben
DeleteObject (SelectObject(HdcBack&,BmpBackOld&))
DeleteObject (SelectObject(HdcObject&,BmpObjectOld&))
DeleteObject (SelectObject(HdcMem&,BmpMemOld&))
DeleteObject (SelectObject(HdcSave&,BmpSaveOld&))
'Speicher-Dc's freigeben
DeleteDC(HdcMem&)
DeleteDC(HdcBack&)
DeleteDC(HdcObject&)
DeleteDC(HdcSave&)
DeleteDC(HdcTemp&)
Waitinput
End
'----------------------------------------------------
|
| | Datum: 27.02.02 21:59 
| |
Vielen Dank, Andreas! :-)
Du dürftest mich davor bewahrt haben einen mittelschweren Nervenzusammenbruch zu bekommen. *g*
Habe mich gestern die halbe Nacht ohne Erfolg damit herumgeschlagen.
Das dürfte es vereinfachen...;-)
Nochmals Danke,
Mischa
|
|
|