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

Windows Discussion :

Win32 - Fenetre qui clignotte


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Win32 - Fenetre qui clignotte
    Bonjour,

    Malgré le titre, il ne s'agit pas d'uin probleme de double-buffer.

    Enfin, je crois pas.

    Voila mon souci : j'ai developpé un plugin pour une application.

    Cette application fourni une fenetre par defaut pour mon plugin (la fenetre principale du plugin)

    Ensuite, je crée et j'ouvre d'autres fenetres (des popups de configs...) depuis cette fenetre principale.

    J'ai donc une classe qui gere mes fenetres, avec le traitement des messages, le dessni en double-buffering, etc...

    Mais à chaque fois que j'ouvre une fenetre popup pour la premiere fois, tout mon bureau et toutes mes fenetres sont redessinées !

    Ce qui produit un effet pas tres agréable....

    Par contre, si je ferme une popup et que je la ré-ouvre, ça ne clignotte pas.

    Auriez-vous une idée à propos de ce problème ?

    Voici le code que j'utilise :

    Création de la WindowClass :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    m_WC.style			    = CS_DBLCLKS;
    m_WC.lpfnWndProc	            = gestionMessagesStatic;
    m_WC.cbClsExtra		            = 0;
    m_WC.cbWndExtra		            = 0;
    m_WC.hInstance		            = (HINSTANCE) hInstance;
    m_WC.hIcon			    = NULL;
    m_WC.hCursor		            = LoadCursor(NULL, IDC_ARROW);
    m_WC.hbrBackground	            = NULL;
    m_WC.lpszMenuName	            = NULL;
    m_WC.lpszClassName	            = "maClasse";
    	
    RegisterClass(&m_WC);
    Création et ouverture de la fenetre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    m_HWND = CreateWindowEx(WS_EX_TOOLWINDOW,
                            "maClasse",
                            m_titre,
                            WS_POPUP,
                            m_positionX,
                            m_positionY,
                            m_surface.largeur,
                            m_surface.hauteur,
                            NULL,
                            NULL,
                            (HINSTANCE) hInstance,
                            (void *)this);
        
    ShowWindow(m_HWND, SW_SHOW);
    Fermeture et auto-destruction de la fenetre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DestroyWindow(m_HWND);
    SetWindowLongPtr(m_HWND, GWL_USERDATA, NULL);
    m_fenetreOuverte = false;
    if (m_autoDestruction) delete this;

  2. #2
    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 ne pense pas que le fait de redessiner tout le bureau soit lié à ton double-buffering, à moins que tu fasses des trucs vraiment bizarres avec InvalidateRect()...

    Par contre, ta popup, elle a bien ta fenêtre comme parent ?
    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.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Je ne pense pas non plus que ce soit lié à mon buffering.

    En plus, tous mes InvalidateRect ont bien un rectangle de preciser, jamais NULL.

    Par contre, non, ma popup n'a pas ma fenetre principale comme parent...

    Ca a une importance ?

    Je ne suis pas hyper-familier de la programmation des fenetres sous windows, alors si tu veux bien m'eclairer un peu sur les relations parent-enfant et fenetre principak-fenetre popup, ce serait cool !

  4. #4
    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
    Ben oui, ça a une importance.
    Une popup (je suppose que par "popup" du veut dire fenêtre modale, comme par exemple une MessageBox()) fait un EnableWindow(false) sur sa fenêtre parent, qui n'est pas supposée être le bureau (sauf peut-être si tu n'as pas de fenêtre du tout dans le thread courant).

    Enfin bref, il est possible que ta popup fasse redessiner le bureau justement parce que tu ne lui as pas donné de parent. Essaie en lui en donnant un (le plus logique)...
    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.

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Oui, effectivement, je n'ai pas pensé à ça.

    Mais je precise que mes fenetre ne sont pas modales.

    C'est plus comme des palettes d'outils flottantes.

    En tout cas, je vais essayer.

    Tant que j'y suis, une autre question : y-a-t-il mieux que mon code pour fermer et detruire une fenetre ?

    L'appel à DestroyWindow ne rend la main qu'après destruction de la fenetre ?

    Merci !

  6. #6
    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
    Si une palette d'outil est flottante, alors elle flotte au-dessus de son [edit]Owner[/edit].
    Ou sinon, c'est le bordel, comme sous le GIMP.

    Généralement, je mets le userdata à NULL dans le traitement du message WM_DESTROY ou WM_NCDESTROY (ces messages sont reçus PENDANT le DestroyWindow()).
    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.

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 528
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 528
    Par défaut
    Citation Envoyé par buzzkaido
    Cette application fourni une fenetre par defaut pour mon plugin (la fenetre principale du plugin)
    un "plugin" pour moi c'est vague : est-ce que c'est unel dll "classique" ou objet ATL-COM ?
    Est-ce qu'il y a une accélération graphique particulière utilisée ( open GL, Direct X...?)

  8. #8
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Le plugin est une dll.

    Et aucune acceleration graphique. Tout est en Win32 + GDI.

  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
    Le GetDC(NULL) me parait particulièrement suspect, d'autant que tu fais un SelectObject (enfin, deux) dedans...
    Citation Envoyé par [url=http://msdn2.microsoft.com/en-us/library/ms533241.aspx]MSDN[/url] : GetDC()
    hWnd : [in] Handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen.
    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 éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Arf !

    Effectivement !

    Dans ce cas, existe-t-il une autre methode pour mesurer un texte ?

    Je precise : mesurer un texte en dehors de tout contexte graphique (pas dans un WM_PAINT...). En gros, au moment où je mesure, je ne connait pas encore le DC sur lequel je vais dessiner.

    Car je voudrais mesurer les textes (pour les menus par exemple) au moment de leur creation (creation du menu) et pas au moment de leur dessin...

  11. #11
    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 essayer avec CreateCompatibleDC(NULL) et DeleteDC()...
    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.

  12. #12
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 528
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 528
    Par défaut
    Citation Envoyé par buzzkaido
    Arf !

    Effectivement !

    Dans ce cas, existe-t-il une autre methode pour mesurer un texte ?
    GetTextExtent et cela fonctionne parfaitement

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

Discussions similaires

  1. [WIN32] fenetre fille au 1er plan
    Par Grulim dans le forum MFC
    Réponses: 3
    Dernier message: 31/01/2006, 18h07
  2. (win32) Fenetre fille avec scrollbar
    Par xeland dans le forum Windows
    Réponses: 4
    Dernier message: 11/11/2005, 10h05
  3. Fenetre qui ferme l'application
    Par pitistef dans le forum MFC
    Réponses: 3
    Dernier message: 04/09/2005, 19h00
  4. Api Win32 : boutons "qui bougent" au passage de la
    Par Spartan03 dans le forum Windows
    Réponses: 9
    Dernier message: 06/06/2005, 23h52
  5. fenetre qui fuit la souris
    Par Nurs dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/11/2004, 23h58

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