recherche de nom de fonction pour éviter le clipping [MFC] - C++ - Programmation
Marsh Posté le 05-04-2005 à 09:33:15
IrmatDen a écrit : Je suppose que c'est à toi de maintenir cette liste ? |
Quelle liste ?
Je ne vois pas comment récupérer les coordonées de la zone image à redessiner ?
Marsh Posté le 05-04-2005 à 15:16:08
Je veux la redessiner car sinon j'ai plus rien d'afficher à l'écran. Pour celà j'ai bien recoder la fonction OnEraseBkgnd mais celle ci doit être appeler pour redessinener toute la fenetre, or moi je voudrai éviter de redessiner toute la fenetre mais seulement la partie éffacé (autre fenetre qui passe devant l'application, ...)
Marsh Posté le 05-04-2005 à 16:47:07
ok j'ai mal posé la question... Où est le mal de redessiner ta fenêtre en entier ?
Marsh Posté le 05-04-2005 à 21:39:00
Ben plus t'as de chose à redessiner plus t'as un effet de clognottement
Le truc c'est que si je savais quel endroit redessiner j'optimiserai l'affichage et donc le phénomène de clipping serais aténuer
Marsh Posté le 05-04-2005 à 21:45:10
ReplyMarsh Posté le 08-04-2005 à 09:58:02
En faite j'avais déjçà vu e site, mais je n'arrive pas à metre en application les CMemDC, le problème est que mon programme ne se rend jamais dans le fonction OnDraw(), et même sir je rajoute ou non le message On_WN_PAINT() dans la table des mesages
Marsh Posté le 08-04-2005 à 18:43:45
Salut,
Je suis pas sûr de bien comprendre ton message mais dans la message map, c'est ça qu'il faut mettre :
Code :
|
avec le lien qui en dit plus : http://msdn.microsoft.com/library/ [...] sg_map.asp
Marsh Posté le 08-04-2005 à 22:55:41
LordHarryPotter a écrit : En faite j'avais déjçà vu e site, mais je n'arrive pas à metre en application les CMemDC, le problème est que mon programme ne se rend jamais dans le fonction OnDraw(), et même sir je rajoute ou non le message On_WN_PAINT() dans la table des mesages |
dans quelle méthode fais tu ton affichage alors ?
Marsh Posté le 08-04-2005 à 23:31:02
SquiZZ a écrit : dans quelle méthode fais tu ton affichage alors ? |
C'est ptete bourrin mais je crois l'avoir déjà dit : OnEraseBkgnd()
Marsh Posté le 08-04-2005 à 23:49:38
bon ben tu utilises CMemDC dans ton OnEraseBkgnd()
Code :
|
et ca devrait marcher.
Marsh Posté le 08-04-2005 à 23:53:44
IrmatDen a écrit : Salut,
|
J'ai essayé mais c'est pour la librairie ATL et moi j'utilise MFC et çà ne reconnait pas le truc (le compilo),
bref voici ma table de message :
Code :
|
Voici le message du compilo :
error C2440: 'static_cast' : cannot convert from 'void (__thiscall GraphiqueMainWin::* )(CDC *,const CRect &,const CRect & )' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
None of the functions with this name in scope match the target type
Bon alors mon skelette de OnDraw est bien : (CDC *,const CRect &,const CRect & ) -> void
Somebody save me
Marsh Posté le 08-04-2005 à 23:56:28
ben le compilo te dit gentillement qu'il attend une fonction du style LRESULT toto(WPARAM,LPARAM) et que tu insistes méchamment pour lui refiler une fonction du style void toto(CDC *,const CRect &,const CRect & )
et le compilo a toujours raison.
Marsh Posté le 09-04-2005 à 08:11:11
vi, il faut que tu respectes la déclaration du callback, que tu le déclares static, et dans sa définition tu appeles ta vrai fonction en utilisant par exemple LPARAM pour lui passer this afin de récupérer les éléments nécessaires à lui passer.
Marsh Posté le 09-04-2005 à 12:49:59
cricri_ a écrit : vi, il faut que tu respectes la déclaration du callback, que tu le déclares static, et dans sa définition tu appeles ta vrai fonction en utilisant par exemple LPARAM pour lui passer this afin de récupérer les éléments nécessaires à lui passer. |
on parle d'une MESSAGE_MAP MFC ici, pas callback, pas besoin de static ici.
quand a WPARAM, LPARAM il suffit de regarder dans la doc a quoi ca corrspond pour chaque message.
Marsh Posté le 10-04-2005 à 00:10:58
non mais moi mon problème c'est que je veux que le prog aille dans la fonctionOnDraw qui est prédéfini (virtuel), donc qu'il veuilles le LRESULT toto(WPARAM,LPARAM), je m'en fiche moi mon but c'est qu'il entre dans OnDraw() quand il le faut. Le problème c'est que ej sais pas comment faire
Marsh Posté le 10-04-2005 à 00:35:31
LordHarryPotter a écrit : non mais moi mon problème c'est que je veux que le prog aille dans la fonctionOnDraw qui est prédéfini (virtuel) |
ben tu surdéfinis OnDraw()
=> même nom, même liste de paramètres et ca devrait marcher.
Marsh Posté le 10-04-2005 à 00:38:07
SquiZZ a écrit : ben tu surdéfinis OnDraw() |
Pas compris, OnDraw doi avec un squelette : (CDC *,const CRect &,const CRect & ) -> void
Donc voilà çà veut dire quoi ton meme nom meme kliste de paramètre
Marsh Posté le 10-04-2005 à 00:52:14
bon faudrait voir a essayer de parler en francais de temps en temps.
Je viens de regarder la doc de CFrameWnd dans la MSDN et il je n'ai pas vu de OnDraw ni dans la classe CFrameWnd ni dans la classe parente CWnd.
Tu peux me dire ou t'as trouvé ton squelette de OnDraw ?
Marsh Posté le 10-04-2005 à 15:00:09
SquiZZ a écrit : bon faudrait voir a essayer de parler en francais de temps en temps. |
SquiZZ : Autant pour moi j'étais bourré quand j'ai vu cette fonction (membre seulement d'une CDialog apparement), sinonpour les CMemDC que je doit utiliser comme des CDC, j'ai un problème :
Code :
|
En faite ce code passe si pDC est un CDC* mais plante si c'est un CMemDC*
Il plante à l'exécution en me passant une fenetre windows Assert machin chose :
Code :
|
Mon problème c'est que si j'ai bien compris, la classe CMemDC remplace complètement la classe CDC. Donc il ne devriait pas y avoir de problème là car si j'ai un CDC çà roule :s
Je sais pas si je suis assez clair. En gros j'ai lut que la class CMemDC était une classe qui était transparente niveau programmation : si çà marche avec les CDC çà marchera avec les CMemeDC sans toucher au code (à pars pour les déclarations CDC).
Marsh Posté le 10-04-2005 à 16:05:23
bordel, tu sais pas déclarer une variable ?
Code :
|
et c'est quoi ce touillage avec &* dans SelectObject ?
[edit : nom de variable]
Marsh Posté le 10-04-2005 à 16:43:44
SquiZZ a écrit : bordel, tu sais pas déclarer une variable ?
|
Parce que j'ai éditer mon et que comme çà marchait pas j'ai tenté çà
Donc en remplaçant par pDC->SelectObject(plateau_brush) j'ai toujours la meme fenetre windows qui s'affiche et toujours au meme endroit.
Voilà
Marsh Posté le 10-04-2005 à 19:21:06
est ce que tu a lu la première partie de mon message précédent ?
Marsh Posté le 10-04-2005 à 21:04:52
SquiZZ a écrit : bordel, tu sais pas déclarer une variable ?
|
Si je sais déclarer une variable, seulement pDC est un des champs de mon objet.
J'ai un objet Dessin qui a comme champs pDC de type CMemDC* (ou avant CDC*) d'où l'initialisation comme çà :
Code :
|
Marsh Posté le 10-04-2005 à 21:26:43
CMemDC s'utilise comme je l'ai mis dans mon exemple.
Tu passes au constructeur le CDC que tu veux gérer en double buffering.
Tu dessines dans le CMemDC et à la destruction de l'instance de CMemDC, il va blitter tout seul le résultat dans le CDC que tu as donné au constructeur.
Marsh Posté le 11-04-2005 à 00:33:32
SquiZZ a écrit : CMemDC s'utilise comme je l'ai mis dans mon exemple. |
Okay, j'initialise bien de CMemDC (enfin je pense) :
Code :
|
Il ne plante pas (y a déjà un progres), mais il ne m'affiche que dalle
Code :
|
Je mets un breakpoint juste après le pDC.Rectangle mais il affiche rien
Désolé mais pourune classe qui s'utilise comme les CDC je m'attendais à pas tant de changements
Marsh Posté le 11-04-2005 à 00:47:20
SquiZZ a écrit : à la destruction de l'instance de CMemDC, il va blitter tout seul le résultat dans le CDC que tu as donné au constructeur. |
ton instance de CMemDC ne doit pas être une variable membre vu que c'est lors de la destruction que la recopie se fait dans le DC qu'on lui a passé en paramètre.
Admettons que ta méthode ou se fait l'affichage s'apelle toto
Code :
|
tu remplaces par :
Code :
|
et ca marche.
c'est pas compliqué, non ? si ?
Marsh Posté le 11-04-2005 à 09:03:18
oki c'est bon j'ai compris, j'avais pas compris que c'était à la destruction que l'objet faisait qqch
J'connaissais pas cette technique (de faire un objet qui "agit seulement" à sa destruction
Mici pour ta persévérance Squizz
Marsh Posté le 11-04-2005 à 09:26:29
SquiZZ a écrit : on parle d'une MESSAGE_MAP MFC ici, pas callback, pas besoin de static ici. |
Oups ... dsl j'ai lu un peu trop en travers ...
Marsh Posté le 11-04-2005 à 17:07:54
Squizz, j veux pasfaire mon boulet mais si
En faite mainteant tout est nickel chrome sauf un détail, dans ma fenetre j'ai inclus une CToolBar et une CStatusBar. Et ces dernières disparaissent lorsque ma CMemDC redessine le bazar
Ne me dis pas qu'il faut reloader la CToolBar et la CStatusBar ?
Marsh Posté le 11-04-2005 à 20:01:51
t'es sûr de passer le bon DC a la construction de CMemDC ?
Marsh Posté le 12-04-2005 à 08:41:28
SquiZZ a écrit : t'es sûr de passer le bon DC a la construction de CMemDC ? |
A priori oui, en gros je fais
Code :
|
En sachant que PlotXXXX() modifie le CDC (enfin le CMemDC) pDC
(mon programme est un jeu d'othello)
Marsh Posté le 14-04-2005 à 22:56:18
down
pourquoi s'embeter avec un pointeur ?
tu peux utiliser une variable automatique et passer ton DC en paramètre bêtement a tes méthodes ?
je pense que ta variable pDC est une variable membre, non ?
au niveau conception ca n'a aucun interret de la mettre en var membre (a mon avis).
tu peux donner la définition de ton pFW ?
Marsh Posté le 15-04-2005 à 00:44:26
le pFW est un pointeur sur mon type dérivé de CFrameWnd.
Sinon je vais essayé de mettre le CMemDC& en paramètre de fonction (et donc ne plus m'en servir comme membre)
Marsh Posté le 15-04-2005 à 09:15:53
Je viens d'essayer de passer CMemDC& comme argument de mes fonctions qui modifie l'affichage et celà ne change rien
Deplus j'ai vraiment l'impession que l'affichage de la barre d'état et de la barre d'outils de ma fenetre est indépendant du CMemDC
Marsh Posté le 15-04-2005 à 23:12:35
tu peux poster un peu le code de ta classe dérivée de CFrameWnd ?
tu peux virer les méthodes Plot*() pour alléger, le problème ne doit pas venir de ces méthodes.
Marsh Posté le 16-04-2005 à 11:54:34
SquiZZ a écrit : tu peux poster un peu le code de ta classe dérivée de CFrameWnd ? |
oki si tu veux, voilà le .h
Code :
|
et le .cpp (juste les 2 fonctions qui actualisent l'écran) :
Code :
|
Marsh Posté le 04-04-2005 à 23:25:18
Bonjour j'aimerai savoir le nom de la fonction (si elle existe) qui me permette de redessiner ma fenetre (une CFramWnd). Mais je veux savoir quelle parte de la fenetre je dois redessiner. Pour l'instant j'utilise la fonction BOOL OnEraseBkgnd(CDC*). Mais je redessine toute la fantre lorsque'une fenetre s'affiche devant mon appli et que je fais bouger celle-ci.
En gros je voudrai aves BOOL OnEraseBkgnd(CRect,CDC*) avec l'objet CRect qui me dise la zone à redessiner.
merci
Message édité par LordHarryPotter le 05-04-2005 à 09:30:53