Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249143 (10579)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Transparenz und co
Mischa Brandt
| 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
Frank Abbing
| 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
Mischa
| 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
Frank Abbing
| 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
Mischa
| 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
Sven Schmidts
| 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
Mischa
| 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
Andreas Miethe
| 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 '----------------------------------------------------
Mischa
| 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

| Zurück zur Übersicht