[C/Win32] Transparence dans XP et compatibilité 95/98/Me/NT

yo! les geeks,

J’ai écrit un soft qui tourne actuellement sur tous les Windows, donc de 95 à XP en passant par Millenium, qui est, soit dit en passant, le plus pénible. Pour le rendre plus joli, je voudrais intégrer la transparence en exploitant l’API d’XP ( notamment SetLayeredWindowAttributes). Mais comme cette API n’est pas présente dans les versions antérieures à XP, lorsque je lance le bestiau sous 98 j’ai droit à une erreur de DLL. Suis-je obligé de faire une version XP avec transparence et une version non XP sans transparence ? Apparemment, même si la fonction n’est pas appelée ça pose un problème. Y a t’il une autre solution ?

Question subsidiaire : dans mon soft, toujours pour le rendre joli, je fais déjà de l’opacité à grand coups de SetWindowRgn (zones affichées et non affichées d’une fenêtre). Ca me permet notamment de faire des fenêtres avec des formes biscornues. Pour ce que j’en ai vaguement vu, il y a dans Windows (toutes versions) de quoi faire de l’alpha blend mais ça me semble assez nébuleux. Ma question : est il techniquement possible de faire de l’alpha au pixel près sur tous les Windows ?

C’est tout pour aujourd’hui
Merciiiiiiiiiiiiii
Antoine

Non, pas a ma connaissance: pas de vrai alpha blend avant 2000 et encore… Ca depend ce que tu veux faire… Mattes du cote de UpdateLayeredWindow sur MSDN et cet exemple sur codeproject. Sinon encore une fois… MSDN est ton ami pour toutes ces questions  La fonction AlphaBlend est plus par DC tout entier, et pas par pixel et est effectivement incluse dans 98, comme indique ici et ici. Si tu veux te faire du vrai per pixel apha blend toute version confondues il va te falloir te le taper en rendering offscreen, plus ou moins a la main et ca sera pas accelere en hardware bien sur…

Pour ne faire que quand t’es sous XP tu peux checker la version de l’OS facilement avant d’appeller certaines fonction specifiques a XP/2000 ou te faire un switch global dans ton appli qui est mis au demarage/install selon la plate forme. Sinon pour les visual styles en general c’est avec les manifests mais j’imagine que tu sais deja faire…

Edit: Precisions

Ce message a été édité par GloP le 09/04/2004

[quote]yo! les geeks,

J’ai écrit un soft qui tourne actuellement sur tous les Windows, donc de 95 à XP en passant par Millenium, qui est, soit dit en passant, le plus pénible. Pour le rendre plus joli, je voudrais intégrer la transparence en exploitant l’API d’XP ( notamment SetLayeredWindowAttributes). Mais comme cette API n’est pas présente dans les versions antérieures à XP, lorsque je lance le bestiau sous 98 j’ai droit à une erreur de DLL. Suis-je obligé de faire une version XP avec transparence et une version non XP sans transparence ? Apparemment, même si la fonction n’est pas appelée ça pose un problème. Y a t’il une autre solution ?

La solution la plus simple à mon avis est de faire un GetVersion. Exemple allapi.net :

Private Declare Function GetVersion Lib “kernel32” () As Long
Public Function GetWinVersion() As String
Dim Ver As Long, WinVer As Long
Ver = GetVersion()
WinVer = Ver And &HFFFF&
'retrieve the windows version
GetWinVersion = Format((WinVer Mod 256) + ((WinVer 256) / 100), “Fixed”)
End Function
Private Sub Form_Load()
'KPD-Team 1999
’URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
MsgBox "Windows version: " + GetWinVersion
End Sub

Question subsidiaire : dans mon soft, toujours pour le rendre joli, je fais déjà de l’opacité à grand coups de SetWindowRgn (zones affichées et non affichées d’une fenêtre). Ca me permet notamment de faire des fenêtres avec des formes biscornues. Pour ce que j’en ai vaguement vu, il y a dans Windows (toutes versions) de quoi faire de l’alpha blend mais ça me semble assez nébuleux. Ma question : est il techniquement possible de faire de l’alpha au pixel près sur tous les Windows ?

Oui c’est possible.

C’est tout pour aujourd’hui
Merciiiiiiiiiiiiii
Antoine[/quote]

Ha voila, j’ai retrouve l’article interessant qui peut te servir que je cherchais… C’est par ici

Merci pour les réponses (et la rapidité)…
Je re-précise une chose : compatibilité de 95 à XP. Aller, comme c’est bientôt Pâque, on va dire de 98 à XP
Et j’oubliais : tout en C/Win32 de base (suis un old-school).
Récupérer la version de l’OS, pas de problème. Mais apparemment si je mets une fonction XP dans mon code, et que je ne l’appelle pas, et bien sous 98 j’aurai droit quand même à une erreur système (DLL manquante ou quelque chose comme ça).
J’ai fait une boulette ou c’est normal ?

En tous cas, pour faire joujou avec de l’alpha sur TOUTES les versions de Windows, ça semble mission impossible. Et selon les OS, quand c’est possible, ça va du très simple à coder au super chiant. Pas très motivant tout ça.

Antoine

Hehe oui mais forcement sur un OS qui a ete developpe il y a plus de 10 ans … c’est pas super intuitif l’apha blending, 10 ans c’est la prehistoire en info. A part de tout faire a la main ou presque je vois pas

Je crois que personne a réellement compris le problème posé ici. A savoir que la liaison dynamique préparée par windows fait planter l’appli dès le lancement, au chargement des dépendancesEn effet, la fonction appellée étant dans la table des dépendances du soft, windows 98 doit tout simplement refuser de lancer le soft (il trouve pas les fonctions déclarées, et ne peux pas effectuer la liaison dynamique à l’execution).

Pour résoudre le problème, il faudrait donc utiliser une liaison tardive pour charger/appeller la fonction en question qu’au moment de son appel.

Je donne ici une direction, vu que je ne sais pas faire (mais sachant très bien que s’est fesable, c’est ce que font tout les logiciels “à plug-ins”).

Sinon, tu peux aussi foutre toutes tes operations de rendu dans une DLL, et apres au demarage de ton appli tu check la version de win, et en fonction, tu charge gui95, guime ou guiXP.dll ?
non ?
Sinon comme le dis tzim GetProcAddress r0x0r !

Pas mieux.
GetProcAddress (loadlibrary … je crois sous windows) ou autre dlopen …

Tu te fais ta DLL d’interface et au démarrage tu “branches” l’API sur les services offerts (ou non) par la DLL graphique.

L’inconvénient c’est de devoir redéfinir une API générique pour l’ensemble des services dont tu as besoin mais c’est plutôt élégant, trouvais-je.