Bonjour ,
Je programme depuis peu en Visual C++ 6.0 et on m'a demandé d'écrire une classe CDialog dont le fond (background) est transparent, mais pas ses contrôles contenus.
J'ai essayé plusieurs tactiques:
A) surcharger OnCtlColor pour retourner un NULL_BRUSH
Le problème ici est que dès que l'on déplace la fenêtre le fond ne se met pas à jour et la fenêtre se déplace avec l'ancien fond, ce qui parait "ugly" .
B) surcharger OnEraseBkgnd pour ne pas peindre le fond (et retourner FALSE)
C'est la solution qui paraissait la plus simple mais elle a le même inconvénient que la précédente solution, le fond ne se met pas à jour lorsque la fenêtre est déplacée .
C) Appeler SetLayeredWindowAttributes
Cette fonction fonctionne bien, la fenêtre est affichée en translucide en fonction du pourcentage passé en paramètre. Le problème est que je voudrais exclure de la transparence les boutons du dialog afin qu'ils apparaissent opaques.
D) utiliser SetWindowRgn avec une région définie par l'utilisateur à l'aide d'un bitmap
J'ai pas vraiment essayé cette tactique mais j'ai lu du code qui l'utilisait et je dois dire qu'elle fonctionne bien (même si je ne la comprend pas bien), le fond est transparent et se déplace comme tel. Cette solution a pour inconvénient de devoir définir un bitmap pour circonscrire la zone transparente, c'est bien pour un "splash screen" mais c'est plus délicat pour un CDialog.
Voilà, j'espérait m'en sortir avec un OnPaint bien senti et éventuellement un BitBlt ou deux entre le window DC et le screen DC, en tous les cas je m'attendais à une solution simple mais il s'agit apparamment d'un problème corsé. Merci d'avance pour vos lumières.
Partager