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

Visual C++ Discussion :

[Win32] Problème de fenêtre transparente et DirectX


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut [Win32] Problème de fenêtre transparente et DirectX
    Bonjour,

    je travaille actuellement sur une application utilisant l'API Win32. Cette appli possède une fenêtre principale, et une fenêtre fille qui peut potentiellement utiliser DirectX pour l'affichage.
    Mon problème est le suivant: si je fais en sorte de rendre ma fenêtre transparente partiellement (en utilisant un style WS_EX_LAYERED, et en indiquant une couleur à rendre transparente (le but est d'avoir une fenêtre qui ne serait pas carrée, par exemple) ), la fenêtre DirectX n'est pas visible, et s'affiche n'importe comment (le déplacement de la fenêtre laisse des trainées sur l'écran).
    J'ai l'impression que Windows affiche un fond de couleur noir par défaut lorsqu'on utilise une fenêtre WS_EX_LAYERED (ce fond s'afficherait donc par dessus la fenêtre directx, la rendant invisible).

    Si je garde ma fenêtre sans transparence, tout fonctionne clairement.

    J'ai pu lire qu'il existait des problèmes entre DirectX et les fenêtres WS_EX_LAYERED. Existe t'il un moyen de contourner ça ?

    Merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    tu utilises le flag WS_EX_TRANSPARENT avec WS_EX_LAYERED?

    WS_EX_LAYERED|WS_EX_TRANSPARENT

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    Non, je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetLayeredWindowAttributes(m_hWnd, cTransparent, cAlpha, LWA_COLORKEY | LWA_ALPHA);
    cTransparent correspond à la couleur que je veux transparente, et cAlpha correspond au pourcentage de transparence que je veux sur ma fenêtre.
    Le but est d'avoir une couleur totalement transparente, et le reste de la fenêtre totalement opaque, afin d'avoir une IHM d'une forme différente que rectangulaire.


    EDIT: je viens d'essayer, si je rajoute le flag WS_EX_TRANSPARENT, je ne peux plus cliquer sur ma fenêtre, et j'ai toujours le même problème d'affichage.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    Est rempli tu la fenetre avec ta couleur de transparence sur
    l'evenement WM_PAINT?

    normalement sur cette evenement tu recupere le hdc de ta fenetre
    et tu fais un un FoodFill(hdc,0,0,Ta_Colorref)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    A vrai dire, ma fenêtre est remplie à partir d'un bitmap, dont certaines parties sont de la couleur correspondant à la transparence. Ces parties là sont censées être transparentes. Le problème, c'est que j'ai une fenêtre fille qui est censée s'afficher par dessus, et que je ne vois plus. Ce problème apparaît uniquement lorsque la fenêtre fille utilise DirectX. Autrement, cela fonctionne très bien.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    pluto trop d'idée desolé
    bon courage

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    Ouais pas grave, je continue à chercher une solution alternative... merci quand même

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Citation Envoyé par Reeter
    je viens d'essayer, si je rajoute le flag WS_EX_TRANSPARENT, je ne peux plus cliquer sur ma fenêtre, et j'ai toujours le même problème d'affichage.
    Ca c'est normal : lorsqu'une fenêtre a le style WS_EX_TRANSPARENT, elle ne reçoit plus les événements souris.
    Par contre je ne me rappelle plus si ceux-ci sont récupérés par l'arrière-plan ou pas...

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je pense qu'on peut recevoir les événements souris, fenêtre transparente ou non, en traitant le message WM_NCHITTEST : Selon l'endroit cliqué, retourner HTCLIENT, HTTRANSPARENT, DefWindowProc()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    ouais en même temps, c'est pas trop grave cette histoire d'évènements, vu que le problème d'affichage reste le même avec ce flag là...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    En fait, je vais expliquer ce que je veux faire, ce sera peut être plus clair pour vous:
    le but est d'avoir une sorte de lecteur de vidéo, un peu comme média player. J'ai une fenêtre principale qui sert d'IHM, avec une barre de manu en haut, des sliders en bas, etc... et j'ai une autre fenêtre qui contient la vidéo qui est en train d'etre lue. Cette deuxième fenêtre est déclarée comme fille de la première, et se situe au milieu de sort qu'on ne voit pas qu'il y a deux fenêtre (le résultat visuel final ressemble beaucoup à Media player). Cette fenêtre utilise DirectX pour afficher la vidéo.
    Mon problème est que ma fenêtre d'IHM utilise la transparence pour avoir des coins arrondis, et éviter d'être toute carrée.
    ==> dès que j'utilise la transparence, la fenêtre fille contenant la vidéo ne s'affiche plus, j'ai l'impression que la fenêtre d'IHM passe par dessus, et donc on ne voit que du noir...

    Es-ce plus clair pour vous ? Quelqu'un verrait une solution à ce problème ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    il faut peut etre que lorsque tu deplaces ta fenetre transparent sur l'autre effeectuer un redraw? (voir RedrawWindow)

    ou sinon peut etre que tu perds ta surface directx tu test la perte de surface?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    Citation Envoyé par Rits
    il faut peut etre que lorsque tu deplaces ta fenetre transparent sur l'autre effeectuer un redraw? (voir RedrawWindow)
    En fait, j'ai essayé de décorréler les deux fenêtres (enlever le lien hiérarchique entre les deux): résultat, la fenetre directx s'affiche bien, mais lorsque je déplace ma fenêtre d'IHM, je suis obligé de dire à la fenêtre directx de se déplacer. Là, ça me pose un autre problème, qui est que la fenêtre directx se déplace avec un temps de retard par rapport à l'IHM, et c'est donc pas très joli...

    Citation Envoyé par Rits
    ou sinon peut etre que tu perds ta surface directx tu test la perte de surface?
    Je n'y connais que dalle en DirectX, j'utilise une brique déjà développée par d'autres collègues et qui me sort ce qu'il faut, dans la fenêtre qu'il gère... Donc là, je ne sais pas vraiment de quoi tu parles :/ Je vais essayer d'aller fouiller sur google pour plus comprendre le sens de ta phrase!

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    essaie qd meme de faire ca sur le WM_PAINT
    FoodFill(hdc,0,0,Ta_Colorref)
    avec en coloref la couleur transparente de ta bitmap

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    Bon, je ne vois pas trop ce que ca pourrait changer, vu que la zone en question est peinte a partir d'un bitmap (de la couleur de transparence). J'ai essayé quand même (j'ai pas la science infuse! ) et malheureusement, ça ne fonctionne pas mieux... snif!
    Je pense essayer une autre solution. Je vais encore décorréler les deux fenêtres (ne plus les avoir en mère/fille, comme ça, elles sont visibles toutes les deux), et essayer de faire en sorte de bouger la fenêtre de la vidéo exactement en même temps que la fenêtre de l'IHM: il doit bien y avoir un moyen, vu que dans Winamp, on peut soit détacher les différentes fenêtres, soit les coller, et dans ce cas, toutes les fenêtres se déplacent en même temps...
    Avez-vous une idée pour réaliser ça avec win32 ?

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux chercher avec des messages comme WM_MOVING...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    déjà essayé: si j'intercepte le message WM_MOVING au niveau de l'IHM et que je dis à la fenêtre de la vidéo de se déplacer pour rester a la même position (relativement à l'IHM), j'ai un effet de retard (comme si la fenêtre de la vidéo était à la bourre d'un message) assez désagréable.
    En gros, quand on fait glisser la fenêtre, on s'aperçoit que la vidéo se décale, mais a toujours quelque pixels de retard sur la fenêtre que l'on bouge...

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Par défaut
    J'ai essayé quand même (j'ai pas la science infuse! )
    en meme temps c'est gratuit pourquoi se privé

    sinon +1 pour WM_MOVING

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 130
    Par défaut
    Comme je le disais plus haut, j'ai déjà essayé, mais j'ai l'impression que la deuxième fenêtre est en retard d'un message, et du coup, ça donne un effet de traînée lorsqu'on déplace la fenêtre...
    Je vais essayer d'accélérer tout ça, mais je ne vois pas vraiment comment.

    Y a t'il un moyen de faire en sorte que les deux fenêtres soient filles d'une même troisième fenêtre invisible ? Je me disais que si on faisait ça, et en positionnant les bons flags, ça me permettrait peut être de les déplacer toutes les 3 en même temps, sans avoir à intercepter d'évènement (et donc en évitant cet effet de retard)...

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Avec WM_NCHITTEST, ça devrait être possible d'intercepter le clic:
    • Faire en sorte que les fils répondent toujours HTTRANSPARENT pour transmettre à la fenêtre mère,
    • Et faire en sorte que la fenêtre mère réponde HTCAPTION au lieu de HTCLIENT (pour permettre de déplacer la fenêtre de n'importe où)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Fenêtre transparente
    Par c-top dans le forum Agents de placement/Fenêtres
    Réponses: 16
    Dernier message: 10/10/2013, 12h33
  2. API Win32 problème de fermeture de fenêtre
    Par Ano dans le forum Windows
    Réponses: 3
    Dernier message: 13/12/2006, 21h37
  3. [WIN32]Problème de compilation.
    Par GETah dans le forum Visual C++
    Réponses: 2
    Dernier message: 29/07/2006, 11h06
  4. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15
  5. [MFC + Win32] Création de fenêtre
    Par nmarf dans le forum MFC
    Réponses: 2
    Dernier message: 05/07/2005, 10h25

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