Accueil > Forum > > > > Rafraichissement graphique
Rafraichissement graphique
mardi 26 juin 2007 à 14:51:15 |
Rafraichissement graphique

thandesyndicate
|
Bonjour! Je réalise une application (MFC) qui comporte une boite de dialogue où je trace un graphique. Cette boite de dialogue comporte quelques controles (boutons, Cedit...) à gauche, et à droite le graphique (qui est dessiné dans la fonction OnPaint). J'ai un thread qui envoie à intervalles réguliers un message à ma boite de dialogue, lorsque ce message est intercepté, je met à jour le graphique grâce à InvalidateRect(CRect,TRUE), CRect ne comportant que la partie droite de ma boite de dialogue (uniquement la partie graphique). Lorsque je compile en mode débug, tout se passe bien, mais lorsque je compile en mode Release, un erreur de mémoire se produit ("la mémoire ne peut pas être read"). Cette erreur se produit uniquement lorsque le pointeur de la souris passe sur un controle, ou lorsque je déplace ma fenetre. De plus, si je rafraichi ma fenetre avec la méthode Invalidate(), l'erreur se produit immédiatement, de même si le CRect de ma méthode InvalidateRect(CRect,TRUE) comporte la partie contenant les controles. Je suppose donc que c'est le rafraichissement des controles qui pose problème, mais je ne comprend pas où est l'erreur, et encore moins comment la corriger... Quelqu'un peut-il m'aider?
|
|
mardi 26 juin 2007 à 15:10:52 |
Re : Rafraichissement graphique

Neo_Fr
|
Réponse acceptée !
T'as essayer de rafraichir toute la fenetre avec: InvalidateRect(hwnd, 0, TRUE); hwnd etant le handle de ta form. Neo_Fr
|
|
mardi 26 juin 2007 à 15:36:58 |
Re : Rafraichissement graphique

thandesyndicate
|
En faisant InvalidRect(hwnd,0,TRUE) depuis mon thread l'erreur est en partie corrrigée.
Le problème est que j'ai mis en place un double buffering pour éviter le scintillement de mon grahique, mais lorsque je rafraichit toute la fenêtre, les boutons scintillent (contrairement au graphique). C'est pour cela que je rafraichissait seulement une partie de ma boite de dialogue.
En plus, l'erreur se produit toujours lorsque je déplace ou que je redimensionne ma fenetre, mais seulement quand le double buffering est mis en place, et pas quand je dessine directement sur la boite de dialogue.
Donc je vais essayer de voir tout ça! Merci beaucoup pour ta réponse!
|
|
mardi 26 juin 2007 à 16:46:11 |
Re : Rafraichissement graphique

aardman
|
Réponse acceptée !
Salut,
Si tu dessines toi même le fond de ton graphique dans le OnPaint(), tu peux juste faire InvalidateRect(0,FALSE).
Si les boutons sont directement positionnés sur la fenetre ou tu
dessines, tu peux ptet essayer de mettre le style WS_CLIPCHILDREN a la
fenetre ou tu dessines.
Et enfin pour les erreurs, sans code on ne peux pas faire grand chose.
|
|
mardi 26 juin 2007 à 17:31:03 |
Re : Rafraichissement graphique

thandesyndicate
|
Le style WS_CLIPCHILDREN permet bien d'éviter le scintillement des boutons, merci!
Voici une partie de mon code. C'est avec ce code que se produit l'erreur décrite dans le premier post...
J'ai essayé de remplacer l'envoi du Message WM_UPDATE_UI dans mon thread par InvalidateRect(hwnd,0,TRUE) mais mon graphique scintille fortement (on dirai que le double buffering n'est plus effectué)...
//Fonction exécutée par mon thread :
UINT ThreadFonction(LPVOID Param){ while(GLOB->m_TransfertContinu){ //On effectue la boucle tant qu'une variable globale est à TRUE
PostMessage((HWND)Param,WM_UPDATE_UI,0,0); Sleep(100); } return 0; }
//Fonction exécutée lors de l'interception du message WM_UPDATE_UI
void COscilloscope::OnUpdateUI() { this->InvalidateRect(0,FALSE); }
//Fonction OnPaint :
void COscilloscope::OnPaint() { CPaintDC fdc(this); // device context for painting
CRect lRect; GetClientRect(lRect); lRect.NormalizeRect();
pDC = GetDC(); dc.CreateCompatibleDC(pDC);
//on y ajoute un bitmap pour agrandir dc memBmp.CreateCompatibleBitmap(pDC, lRect.Width(), lRect.Height()); CBitmap* OldBmp = dc.SelectObject(&memBmp);
//Remplissage du fond CBrush backBrush(RGB(250,250,250)); dc.FillRect(lRect,&backBrush);
//Ces trois fonctions permettent de dessiner mon graphique (le prog plante même si elles ne sont pas exécutées donc l'erreur ne vient pas de la) DrawLine(&dc, 6); DrawRepere(&dc); DrawGraph(&dc);
//fdc.BitBlt(0,0,lRect.Width(),lRect.Height(),&dc,0,0,SRCCOPY); //on copie dc vers fdc (solution 1) pDC->BitBlt(0,0,lRect.Width(),lRect.Height(),&dc,0,0,SRCCOPY); //on copie dc vers fdc (solution 2) //Ces 2 solutions de copie ne changent pas mon problème! dc.SelectObject(OldBmp); dc.DeleteDC(); memBmp.DeleteObject(); ReleaseDC(pDC); }
|
|
mardi 26 juin 2007 à 17:43:24 |
Re : Rafraichissement graphique

thandesyndicate
|
Désolé je me suis trompé dans mon précédent post...
J'ai essayé de remplacer l'envoi du Message WM_UPDATE_UI dans mon
thread par InvalidateRect(hwnd,0,FALSE) . Je n'ai dans ce cas plus de problème de scintillement, par contre, mon erreur se produit lorsque que je déplace, redimensionne ou ferme la fenetre...
|
|
mardi 26 juin 2007 à 18:18:23 |
Re : Rafraichissement graphique

thandesyndicate
|
Réponse acceptée !
Finalement en combinant vos 2 réponses ça marche très bien donc encore merci... J'avais du faire une mauvaise manip dans mon OnPaint() à force de tout bidouiller...
Je met le code pour ceux que ça intéresse, il permet donc de repeindre une fenetre depuis un thread, en evitant l'effet de scintillement.
void COscilloscope::OnPaint() { CPaintDC fdc(this); // device context for painting
CDC *pDC; pDC=GetDC();
CRect lRect; GetClientRect(lRect); lRect.NormalizeRect();
//mise en place du double-buffering CDC dc; dc.CreateCompatibleDC(pDC);
//on y ajoute un bitmap pour agrandir dc CBitmap memBmp; memBmp.CreateCompatibleBitmap(pDC, lRect.Width(), lRect.Height()); CBitmap* OldBmp = dc.SelectObject(&memBmp);
//On va peindre le fond CBrush backBrush(RGB(250,250,250)); dc.FillRect(lRect,&backBrush);
//Ces trois fonctions permettent de dessiner sur la boite de dialogue DrawLine(&dc); DrawRepere(&dc); DrawGraph(&dc);
//on bascule dc vers fdc fdc.BitBlt(0,0,lRect.Width(),lRect.Height(),&dc,0,0,SRCCOPY); dc.SelectObject(OldBmp); dc.DeleteDC(); memBmp.DeleteObject(); ReleaseDC(pDC); }
UINT ThreadFonction(LPVOID Param){ while(m_TransfertContinu){ //On effectue le thread tant que la variable m_tranfertContinu=TRUE InvalidateRect((HWND)Param,0,FALSE); //le HWND de ma fenetre est passé à mon thread en paramètre Sleep(40); } return 0; }
Ne pas oublier de mettre votre boite de dialogue en style WS_CLIPCHILDREN!
|
|
mercredi 27 juin 2007 à 00:59:56 |
Re : Rafraichissement graphique

aardman
|
Salut,
Une petite remarque a propos du dernier code: le GetDC/ReleaseDC est inutile, c'est le fdc qu'il faut utiliser.
|
|
mercredi 27 juin 2007 à 10:58:20 |
Re : Rafraichissement graphique

thandesyndicate
|
Oui effectivement mon pDC ne sert à rien, merci. On peut donc supprimer les lignes "CDC *pDC;", "pDC=GetDC();" et "ReleaseDC(pDC);" et remplacer les "pDC" par des "&fdc".
|
|
Cette discussion est classée dans : graphique, boite, rafraichissement, dialogue, crect
Répondre à ce message
Sujets en rapport avec ce message
Zone graphique dans boite dialogue [ par goutbouyo ]
Salut,Je me suis fait un petit générateur de map et j'aimerais bien insérer une zone graphique dans ma boite de dialogue pour voir le rendu de ma map
Graphique ds boite dialogue [ par titio ]
Bonjour, Je souhaite afficher un dessin dans une boite de dialogue. A priori, c'est simple, il suffit de lancer le dessin dans le message WM_PAINT, ma
Rafraichissement [ par obby ]
Salut, J'ai un gros problème avec un soft que je suis en train de dévellopez. En fait il tourne bien sauf que si j'affiche une boite de dialogue d
pas de rafraichissement... [ par jojomillenium ]
Bonjour,J'ai créé un programme qui permet d ouvrir un fichier avec des coordonnée pour les lire et ensuite les afficher, avec une fenetre de dialogue
Boite de dialogue... [ par petitjeg ]
Bonjour à toutes et à tous!Vous avez devant vous un ultra débutant qui ne sais pas comment ouvrir un programme avec visual C++. Voilà, j'ai créer une
dll et boite de dialogue [ par juguivin ]
Bonjour.Je me lance dans la conception de dll pour Pixia , logiciel de graphisme; avec Devcmes dll sont bien reconnues et fonctionnent sauf la boite
Boite de dialogue et WM_KEYDOWN [ par solidsnake88 ]
Bonjour à tous, juste une question a propos de l'interception de WM_KEYDOWN par une boite de dialogue qui possede des controles a l'interieur. J'
réduction dans le systray d'une appli MFC Boite de dialogue [ par matt22 ]
Bonjour à tous et d'avance merci pour votre aide. Je suis pas très doué en C++ et j'ai un petit soft a faire absolument. j'ai fais un petit programme
Construire une boite de dialogue [ par NairodDorian ]
Bonjour,Je me pose une question sur la construction de mes boites de dialogue, en effet, je construis ces dernieres en utilisant DialogBoxParam sans "
police d'edit de boite de dialogue [ par by_rabbit_08 ]
Bonsoir!J'ai une boite de dialogue, crée dans un fichier resource, dans la quelle j'ai un edit. Comment est-ce que je fais changer la police de cet ed
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|