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

  1. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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.

  2. #22
    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 : 43
    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
    Points : 734
    Points
    734
    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...

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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.

  4. #24
    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 : 43
    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
    Points : 734
    Points
    734
    Par défaut
    Je viens de refaire differents tests...

    - J'ai supprimé tous mes appels à GetDC(NULL) et remplacer par CreateCompatibleDC()
    - J'ai préciser le HWND de la fenetre parent à chacune de mes fenetres

    Mais aucun changement...

    Pour infos, voici comment est crée la fenetre principale de mon plugin par le logiciel hôte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WNDCLASS windowClass;
    windowClass.style = CS_GLOBALCLASS;    //|CS_OWNDC;
    windowClass.lpfnWndProc = WindowProc; 
    windowClass.cbClsExtra  = 0; 
    windowClass.cbWndExtra  = 0; 
    windowClass.hInstance   = GetInstance (); 
    windowClass.hIcon = 0; 
    windowClass.hCursor = LoadCursor (NULL, IDC_ARROW);
    windowClass.hbrBackground = GetSysColorBrush (COLOR_BTNFACE); 
    windowClass.lpszMenuName  = 0; 
    windowClass.lpszClassName = gClassName;
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pHwnd = CreateWindowEx(0,
                           gClassName,
                           "Window",
                           WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                           0, 0, size.width (), size.height (), 
                           (HWND)pSystemWindow,
                           NULL,
                           GetInstance(),
                           NULL);
    Euh, ce n'est pas moi qui est commenté le CS_OWNDC, c'est fait comme ça dans le code du SDK qui est fourni.

  5. #25
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    windowClass.hbrBackground = GetSysColorBrush (COLOR_BTNFACE);
    Erreur.
    http://blogs.msdn.com/oldnewthing/ar...8/1165907.aspx
    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.

  6. #26
    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 : 43
    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
    Points : 734
    Points
    734
    Par défaut
    Bien vu !

    Effectivement, ça m'a echappé.

    D'une manière générale, le SDK que j'utilise n'est pas tres bien ecrit (la partie qui gere la fenetre, en tout cas est sacrement fouilli) donc je me demande si le problème ne viendrait pas de ce coté là...

    Sauf que je ne sais pas trop quoi chercher...


    Sinon, j'ai fait un autre test :j'ai "chronometré" le temps d'execution de ces deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CreateWindowEx(WS_EX_TOOLWINDOW,"mpdsWndClass",m_titre,WS_POPUP,m_positionX,m_positionY,m_surface.largeur,m_surface.hauteur,m_parentHWND,NULL,(HINSTANCE) hInstance,(void *)this);
    ShowWindow(m_HWND, SW_SHOW);
    En utilisant ce code :

    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
    QueryPerformanceCounter((LARGE_INTEGER *) &compteur1);
    
    if (!m_fenetreOuverte)
    {
       m_fenetreOuverte = true;
       m_HWND = CreateWindowEx(WS_EX_TOOLWINDOW,"mpdsWndClass",m_titre,WS_POPUP,m_positionX,m_positionY,m_surface.largeur,m_surface.hauteur,m_parentHWND,NULL,(HINSTANCE) hInstance,(void *)this);
       ShowWindow(m_HWND, SW_SHOW);
    }
    
    QueryPerformanceCounter((LARGE_INTEGER *) &compteur2);
    QueryPerformanceFrequency((LARGE_INTEGER *) &frequence);
    dureeMS = (compteur2 - compteur1) * 1000.0;
    dureeMS = dureeMS / (double) frequence;
    sprintf(chaineDebug,"cGuiFenetre::ouvrir() : %f\n",dureeMS);
    OutputDebugString(chaineDebug);

    Et j'obtiens des temps variant entre 30 et 120 ms pour la premiere ouverture d'une fenetre (meme une petite tres simple) et entre 1 et 5 ms pour les ouvertures suivantes (fermeture puis re-ouverture).

    Donc je me demande si ce temps particulierement long est dû au re-dessin de tout le bureau ou si le clignottement de tout le bureau est dû à ce temps particulierement long...

    Lors de la premiere ouverture, je crée une bitmap qui va servir de backbuffer, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    m_hdcDestination = BeginPaint(hwnd, &m_PS);
    m_hbitmapBackBuffer = CreateCompatibleBitmap(m_hdcDestination, m_surfaceBackBuffer.largeur, m_surfaceBackBuffer.hauteur);
    m_hdcBackBuffer = CreateCompatibleDC(m_hdcDestination);
    m_hdcSource = CreateCompatibleDC(m_hdcBackBuffer);

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pourquoi utiliser des casts pour tes LARGE_INTEGER ?
    Tu devrais utiliser directement des vrais LARGE_INTEGER et utiliser leur champ QuadPart pour tes calculs..

    Sinon, les DC et bitmap, je serais plutôt du genre à les créer une bonne fois pour toute dans le traitement de WM_CREATE (et éventuellement changer le bitmap si la fenêtre est redimensionnée).

    Tu devrais peut-être essayer d'affiner ton chronométrage: Voir ce qui prend le plus de temps entre le CreateWindowEx() et le ShowWindow()...
    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.

  8. #28
    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 : 43
    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
    Points : 734
    Points
    734
    Par défaut
    1/ Pour les LARGE_INTEGER, c'est parceque j'ai recopié ce bout de code sans me poser de questions (il était tard hier soir)

    2/ C'est ce que je fais, mais au premier WM_PAINT : si les bitmaps/DC ne sont pas créé ou ne sont pas à la bonne taille, on les recrée, sinon on reutilise les memes

    3/ Affiner : oui, il etait vraiment tard, j'y ai pas pensé


    Un avis la-dessus ?

    Donc je me demande si ce temps particulierement long est dû au re-dessin de tout le bureau ou si le clignottement de tout le bureau est dû à ce temps particulierement long...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne sais pas.
    Déjà, tu devrais introduire une pause (genre Sleep(2000)) entre les deux, pour savoir si le clignottement de tout le bureau se produit lors du CreateWindow() ou lors du ShowWindow()...
    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. #30
    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 : 43
    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
    Points : 734
    Points
    734
    Par défaut
    hum, oui, bonne idée...

    J'essairais tout ça ce week-end

    En tout cas, j'ai l'impression d'avoir mis les pieds dans un truc sacrement foireux...

  11. #31
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    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

  12. #32
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À ma connaissance, GetTextExtent() est obsolète au point de ne même plus être documentée, et GetTextExtentPoint32() ne marche pas en multiligne...
    De toutes façons, les deux nécessitent un DC...
    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.

  13. #33
    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 : 43
    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
    Points : 734
    Points
    734
    Par défaut
    Bon, ben, j'ai eu le temps de refaire 2-3 tests pour comprendre ce qui se passe...

    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    windowClass.hbrBackground = GetSysColorBrush (COLOR_BTNFACE);
    Erreur.
    http://blogs.msdn.com/oldnewthing/ar...8/1165907.aspx

    Même si je n'ai pas très bien compris la relation de cause à effet, c'est bien ça qui pose probleme.

    J'ai remplacé par windowClass.hbrBackground = NULL; (ce qui ne pose pas de probleme, car l'intégralité de la surface de la fenetre est couvert par WM_PAINT)

    Et là, plus de clignotement...

    C'est donc bien le code du SDK que j'utilise qui est en cause, et.... résolu !

    Grand merci à Medinoc pour l'aide apportée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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