halbtransparente Darstellung
Moderatoren: crack, Krüsty, Marwin
-
Rainer
- Alter Hase
- Beiträge: 81
- Registriert: Freitag 21. Juli 2006, 14:39
- Wohnort: Senftenberg
- Kontaktdaten:
halbtransparente Darstellung
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
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
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
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 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
with best regards,
crack
-
Rainer
- Alter Hase
- Beiträge: 81
- Registriert: Freitag 21. Juli 2006, 14:39
- Wohnort: Senftenberg
- Kontaktdaten:
halbtransparente Darstellung
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
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
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
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
with best regards,
crack
-
Rainer
- Alter Hase
- Beiträge: 81
- Registriert: Freitag 21. Juli 2006, 14:39
- Wohnort: Senftenberg
- Kontaktdaten:
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
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
hier mein Codesnippet:
mit 200 etwas herumspielen (Transparenzgrad) oder gleich http://msdn2.microsoft.com/en-us/library/ms633540.aspx nachlesen
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
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:
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:
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
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:
MSDN sagt dazuWS_EX_LAYERED equ 00080000h
Layered Windows bieten diese "special effects" wie Transparenz etc.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
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
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:
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
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
- crack
- Administrator
- Beiträge: 280
- Registriert: Dienstag 21. Dezember 2004, 15:02
- Wohnort: 53783 Eitorf
- Kontaktdaten:
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
with best regards,
crack