halbtransparente Darstellung

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

Moderatoren: crack, Krüsty, Marwin

halbtransparente Darstellung

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Beitragvon 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
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

halbtransparente Darstellung

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Beitragvon 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
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Beitragvon 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
CDW
Alter Hase
 
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Beitragvon 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 :)
CDW
Alter Hase
 
Beiträge: 62
Registriert: Donnerstag 2. Oktober 2003, 17:17

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Beitragvon 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
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon 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
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg


Zurück zu Assembler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron