IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Comment rendre tranparent le background d'un CDialog mais pas ses contrôles


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Comment rendre tranparent le background d'un CDialog mais pas ses contrôles
    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.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Pour répondre à ma propre question il suffit d'utiliser SetLayeredWindowAttributes avec l'option LWA_COLORKEY et de surcharger OnCtlColor avec la même couleur dans les deux cas.

    En fait la réponse provient de la FAQ Visual C++ mais j'avais pas bien lu:
    http://cpp.developpez.com/faq/vc/?pa...#DialogLayered

    Citation Envoyé par arnaultbonafos Voir le message
    Bonjour ,

    J'ai essayé plusieurs tactiques:
    ...
    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.
    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/03/2010, 18h17
  2. Réponses: 5
    Dernier message: 14/12/2009, 09h36
  3. Background centré sur IE mais pas sur FF
    Par -Nyk- dans le forum Mise en page CSS
    Réponses: 13
    Dernier message: 07/01/2009, 01h29
  4. Comment rendre un background cliquable
    Par yule dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 11/02/2008, 17h26
  5. Réponses: 8
    Dernier message: 01/03/2006, 18h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo