cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005
-
22 déc. 2004 à 11:41
cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005
-
23 déc. 2004 à 15:32
Bonjour
Je travaille sous visual C++ et j'ai un petit problème de classe et de contexte mémoire. Je crée une classe ligne que j'appelle ds ma fonction afficherMenu mais à la compilation, il trouve une erreur dans la fonction dessiner :
error C2664: 'Dessiner' : cannot convert parameter 1 from 'class CDC' to 'class CDC'
No copy constructor available for class 'CDC'
Je pense aussi qu'il y eu erreur dans mon code au niveau de la déclaration du CpaintDC. J'ai du mal avec les contextes de périphériques.
Sinon sans l'appel à ma classe le programme marche parfaitement.
Je vous remercie pour votre aide car ça fait un moment que je bloque sur ce problème.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 22 déc. 2004 à 14:21
Il n'y a aucun constructeur par recopie pour les objets MFC encapsulant des handles (et il ne faut pas les rajouter sous peine de fuites mémoires). Il faut passer ces objets par référrence ou par pointeur :
cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005 22 déc. 2004 à 17:38
Je te remercie pour ton aide, ça fonctionne.
Cependant j'ai un autre problème. Je crée une classe rectangle qui permet d'afficher du texte dans un rectangle, mais lorsque je l'appelle , elle dessine le rectangle mais pas le texte.
Voici le code :
Alors je sais pas si ça vient du fait que mon buffer mémoire est tjs le meme pour les deux classes ou d'autre chose.
Je vais chercher de mon coté, c'est peut etre un problème de brosse non déséléctionné. Je débute là dedans et j'ai un peu de mal.
cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005 22 déc. 2004 à 20:00
alors j'ai essayé avec des couleurs primaires mais rien à faire il m'affiche tjs mon rectangle ds lequel on peut changer les couleurs ou la bordure, en revanche je n'arrive tjs pas à afficher le texte.
Je ne vois pas trop de quoi ça peut venir.
cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005 22 déc. 2004 à 20:33
je sais pas pourquoi mais la fonction SetTextAlign empeche le texte de s'afficher dans le rectangle qd je l'enlève ça marche nickel. Merci pour ton aide.
Sinon une question vu que tu m'as l'air assez doué ds le GDI, j'aimerai éviter de redessiner le fond de ma page à chaque fois, comment puis je faire ? Ou faut il que je le dessine ? Et il faut utiliser la fonction InvalidateRect(rect, FALSE) mais tout ce que j'ai essayé ne marche pas.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 23 déc. 2004 à 09:01
POur que le systeme ne redessine pas le fond automatiquement :
- mettre NULL pour le HBRUSH du fond dans le WNDCLASS lors de l'enregistrement de la classe de fenêtre (sous MFC c'est plus dur, il faut enregistrer une nouvelle classe de fenêtre dans PreCreateWindow.
- l'autre solution est de surcharger la fonction OnEraseBkGnd et de retourner TRUE sans appeler la fonction de la classe de base, ainsi, le fond de la fenêtre ne sera pas dessiner automatiquement.
Maintenant, dans OnPaint (ou OnDraw pour les vues), il faudra dessiner le fond toi-même. Le mieux, c'est de créer un DC en mémoire de la taille de la zone cliente, de remplir avec la couleur de fond souhaitée, puis de dessiner dedans au lieu du DC fourni. A la fin, il suffira de faire un BitBlt sur le Dc fournit pour recopier en une seule fois à l'écran (pas de clignotement dans ce cas). C'est la technique du double-buffering (pas mal de sources et de questions du forum s'y rapporte, tu pourra y trouver des exemples.
cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005 23 déc. 2004 à 10:30
je débute sous visual et je comprends pas trop ce que tu veux dire par surcharger la fonction OnEraseBkGnd sans appeler la fonction de la classe de base. En fait il faut forcer cette donction à retourner TRUE.
Faut que j'essaye mais si je crée un buffer mémoire dcMem dans le onPaint est ce que je pourrai réutiliser le meme ds mes fonctions afficher ou faut il en créer un autre et blitter son contenu à l'écran par dessus le buffer mémoire de ma fonction OnPaint.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 23 déc. 2004 à 11:00
Dans le class wizard, tu recherche WM_ERASEBKGND, et tu ajoute la fct
tu lui fait retourner TRUE sans faire CWnd::OnEraseBkGnd ou autre mis automatiquement.
Je pense qu'il faudra en créer un autre, dessiner le fonf et copier ton dc mémoire dednans puis blitter à l'écran
cs_gregory6
Messages postés22Date d'inscriptionjeudi 14 octobre 2004StatutMembreDernière intervention 3 janvier 2005 23 déc. 2004 à 15:32
salut
j'ai essayé ce que tu as dit mais j'arrive pas à intercepter WM_ERASEBKGND ds le class wizard ni OnDraw mais j'ai tapé la fonction
BOOL CProjecttestDlg::OnEraseBkgnd(CDC& dcMem1)
{
return FALSE;
}
et je dessine ds ce nouveau CDC dcMem1 ds le OnPaint.
je crée un dc compatible et je le bitblt.
je bitblt tjs dcMem mais ça ne marche pas. Il m'affiche le fond au démarrage puis rien d'autre.
J'ai une erreur aussi que je ne comprends pas
dc.SelectObject(pOldBitmap);
c ds mon DC mémoire dcMem que je dois sélectionner ma bitmap mais si je met dcMem à la place de dc, ça ne fonctionne pas.
Bref c pas clair ce que je dis mais j'ai vraiment du mal.
Si t'as une idée ou des info, encore merci.