Le GetDC(NULL) me parait particulièrement suspect, d'autant que tu fais un SelectObject (enfin, deux) dedans...
Envoyé par [url=http://msdn2.microsoft.com/en-us/library/ms533241.aspx]MSDN[/url] : GetDC()
Le GetDC(NULL) me parait particulièrement suspect, d'autant que tu fais un SelectObject (enfin, deux) dedans...
Envoyé par [url=http://msdn2.microsoft.com/en-us/library/ms533241.aspx]MSDN[/url] : GetDC()
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...
Tu peux essayer avec CreateCompatibleDC(NULL) et DeleteDC()...
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 :
Et :
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;
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.
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);
Erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part windowClass.hbrBackground = GetSysColorBrush (COLOR_BTNFACE);
http://blogs.msdn.com/oldnewthing/ar...8/1165907.aspx
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 :
En utilisant ce code :
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);
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);
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()...
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...
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()...
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...
GetTextExtent et cela fonctionne parfaitementEnvoyé par buzzkaido
À 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...
Bon, ben, j'ai eu le temps de refaire 2-3 tests pour comprendre ce qui se passe...
Envoyé par Médinoc
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager