halbtransparente Darstellung

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Antworten
Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

halbtransparente Darstellung

Beitrag von Rainer » Sonntag 8. Juli 2007, 11:15

Hallo,
verschiedentlich sieht man in Programmen eine Art Static mit Schrift, hinter dem der Bildschirm noch zu sehen ist. Weiß jemand, wie das gemacht wird?

Gruß Rainer

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Beitrag von crack » Sonntag 8. Juli 2007, 12:13

Ungefähr so:

mit CreateWindowsClassEx erstellst Du eine selbstdefinierte Fensterklasse mit dem transparenten Hintergrund, die kannst Du dann für diesen Zweck verwenden. Für präzisere Informationen schaue bitte in die Win32SDK.hlp, ausserdem findest Du ein Beispiel in den Examples in dem MASM 32 Paket.
mit freundlichen grüssen,
with best regards,

crack

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

halbtransparente Darstellung

Beitrag von Rainer » Sonntag 8. Juli 2007, 13:59

Hallo crack,

vielen Dank für die Antwort. Transparente Darstellung ist nicht das Problem, ich wollte es halbtransparent, und da komme ich nicht weiter. Ich habe schon probiert, den Bildschirmteil mit GetPixel - umrechnen - SetPixel neu zu schreiben, aber das ist bei einem größeren Bereich zu langsam. Ich habe schon auf OpenGL getippt, aber damit habe ich leider noch keine Erfahrungen.

Gruß Rainer

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Beitrag von crack » Sonntag 8. Juli 2007, 14:02

Benachrichtigungsfenster im Trillian sind mitunter halbtransparent, um zu erfahren wie das gemacht wird könntest Du dir irgendwo die Entwicklerdateiien für PluginProgrammierer runterladen (plugin.h) und dort mal schauen. OpenGL ist sicherlich ein gutes Stichwort.
mit freundlichen grüssen,
with best regards,

crack

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von Rainer » Sonntag 8. Juli 2007, 17:10

Hallo crack,

unter plugin.h habe ich leider nichts gefunden, was ich irgendwie einordnen kann, aber unter OpenGL habe ich den Link

http://perso.orange.fr/franck.charlet/Ogl_Asm.zip

gefunden. Die Beispiele scheinen gut zu sein, leider habe ich noch keins zum Laufen bekommen.

Gruß Rainer

CDW
Alter Hase
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17
Kontaktdaten:

Beitrag von CDW » Montag 16. Juli 2007, 20:57

hier mein Codesnippet:

Code: Alles auswählen


       .data
		User32        db 'User32.dll',0
		SLWA          db 'SetLayeredWindowAttributes',0
		Trans         dd 1 ; Just a flag (0 = opaque, -1 = transparent)
		pSLWA dd 0
		.code
		
		invoke GetWindowLongA,hWnd,GWL_EXSTYLE
		or eax,80000h
		invoke SetWindowLongA,hWnd,GWL_EXSTYLE,eax
		
		
		invoke LoadLibrary,addr User32
		invoke GetProcAddress,eax,addr SLWA
		
		mov pSLWA,eax
		
		
		push 2
		push 200          ; alpha value
		push 0;
		push hWnd
		call pSLWA 
mit 200 etwas herumspielen (Transparenzgrad) oder gleich http://msdn2.microsoft.com/en-us/library/ms633540.aspx nachlesen

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von Rainer » Montag 16. Juli 2007, 22:01

Hallo EBFE,

vielen Dank für Deinen Code, ich habe ihn gleich mal ausprobiert und es ist genau das, was ich gesucht hatte. Da wäre ich nicht drauf gekommen. Jetzt gehe ich dran, das Ganze auch zu verstehen.

Nochmals vielen Dank und eine schöne Woche (für den Rest).

Gruß Rainer

CDW
Alter Hase
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17
Kontaktdaten:

Beitrag von CDW » Dienstag 17. Juli 2007, 00:59

Da gibt es nicht viel zu verstehen, der Code stammt noch aus MASM v7.0 Zeiten, in denen die Windows.INC noch nicht so vollständig war, wie jetzt ;).
Zuerst wird der bestehende EX_STYLE des Fensters geholt und um WS_EX_LEAYERED erweitert:

or eax,8000h sollte dasselbe sein, wie
or eax,WS_EX_LAYERED
mittlerweile ist es in Windows.inc vorhanden:
WS_EX_LAYERED equ 00080000h
MSDN sagt dazu
WS_EX_LAYERED
Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC
Layered Windows bieten diese "special effects" wie Transparenz etc.

Dann wird per SetLayeredWindowAttributes das Attribut gesetzt.


wenn wir schon dabei sind:
diese API: SetLayeredWindowAttributes ist erst ab win2k vorhanden,
deswegen sollte nach GetProcAddress noch ein kleiner Check rein:

Code: Alles auswählen

invoke LoadLibrary,addr User32
invoke GetProcAddress,eax,addr SLWA 
.if eax==NULL
  jmp no_transparency_irgendwas
.endif
damit auch WinNT und Win 9.x Systeme keine Probleme haben.

der Code ist übrigens nicht von mir, sondern noch aus dem alten win32asm forum (board.win32asmcommunity.net)
die haben aber mittlerweile einige Boardupdates, so dass leider die meisten älteren Anhänge mit Codes fehlen.
Da ich aber zu den Zeiten noch mit Modem unterwegs war, habe ich recht viele davon noch in den unzähligen Archiven auf meiner Platte :)

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von Rainer » Dienstag 17. Juli 2007, 16:27

Hallo EBFE,

danke für die Erklärungen. Ich hatte gestern abend in der Windows.inc mal nach einem WS_EX-Style von 80000h gesucht, aber keinen gefunden. Den trage ich jetzt entsprechend nach.
Die Variante mit GetProcAddress ist natürlich "sauber", wenn die Funktion noch nicht verfügbar ist. Ich habe es mit WinXP mit Invoke ausprobiert, da funktioniert das natürlich. Bei WinME gibt's eine Fehlermeldung und das wäre dann nicht so schön für einen Anwender, wenn es nicht vorher abgefangen würde.
Nochmals vielen Dank, dass Du Dir die Zeit für die Erklärungen genommen hast.

Gruß Rainer

Benutzeravatar
crack
Administrator
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf
Kontaktdaten:

Beitrag von crack » Donnerstag 19. Juli 2007, 15:36

Oh, Du solltest die Priorität nicht bei der Win ME Kompatibilität setzen, wenn dein Programm erstklassig unter 98SE, 2000 und XP läuft hast Du damit die Masse der Anwender abgedeckt. ME ist etwas problematisch, wenn da was nicht klappt kanns kompliziert werden. Tip: im Fehlerabfang berücksichtigen ob die verwendeten DLL die benötigten Funktionen bereitstellen.
mit freundlichen grüssen,
with best regards,

crack

Rainer
Alter Hase
Beiträge: 81
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von Rainer » Donnerstag 19. Juli 2007, 16:32

Hallo crack,

danke für den Tip. Das Prüfen auf Vorhandensein von Funktionen scheint bei Windows öfter mal besser zu sein.

Mit freundlichen Grüßen
Rainer

Antworten