begin process at 2012 05 29 21:33:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

problème ontexte mémoire et classe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème ontexte mémoire et classe

mercredi 22 décembre 2004 à 11:41:13 | problème ontexte mémoire et classe

gregory6


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.

++
Joyeuses Fetes

CDC dcMem;

void CProjecttestDlg::AfficherMenu ()
{
CPaintDC dc(this);
GetClientRect(rect);

dcMem.CreateCompatibleDC(&dc);

bitmap.CreateCompatibleBitmap(&dc,240,320);
CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);

CBrush backBrush (RGB(010,106,010));
dcMem.FillRect(rect, &backBrush);

CString s0="TEXTE";
dcMem.SetTextAlign(TA_BASELINE | TA_LEFT);
dcMem.SetTextColor(RGB(255,255,255));
dcMem.SetBkMode(TRANSPARENT);
dcMem.TextOut(38,18,s0,11);

int ct[3];
ct[0]=255;
ct[1]=128;
ct[2]=000;

ligne line1(0,25,240,25,1);
line1.Dessiner(dcMem,pinceau);
ligne line2(160,0,160,320,1);
line2.Dessiner(dcMem,pinceau);

}

void CProjecttestDlg::OnPaint()
{
CPaintDC dc(this);
GetClientRect(rect);

dc.BitBlt(0,0,240,320,&dcMem,0,0,SRCCOPY);

dc.SelectObject(pOldBitmap);//pr l'instant supprimer
bitmap.DeleteObject();
dcMem.DeleteDC();
}

//Ligne.h

class ligne
{
private:
int x1;
int x2;
int y1;
int y2;
int couleurBord;

public:
ligne();
ligne(int,int,int,int,int);
void Dessiner(CDC,CPen*[7]);
};


//ligne.cpp

ligne::ligne()
{
}

ligne::ligne(int xx1,int yy1, int xx2, int yy2,int CB)
{
x1=xx1;
x2=xx2;
y1=yy1;
y2=yy2;

couleurBord=CB;

}

void ligne::Dessiner(CDC dcMem, CPen* ppinceau[7])
{
CPen* pOldPen;
pOldPen=dcMem.SelectObject(ppinceau[couleurBord]);
dcMem.MoveTo(x1,y1);
dcMem.LineTo(x2,y2);

dcMem.SelectObject(pOldPen);
}
mercredi 22 décembre 2004 à 12:06:39 | Re : problème ontexte mémoire et classe

luhtor

J'ai du mal a comprendre ton programme. Mais si simplement tu crées le constructeur de copie de la class CDC, ca fait quoi ?
mercredi 22 décembre 2004 à 14:21:58 | Re : problème ontexte mémoire et classe

ymca2003

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 :

void ligne::Dessiner(CDC& dcMem, CPen* ppinceau[7])

void ligne::Dessiner(CDC* pdcMem, CPen* ppinceau[7])

mercredi 22 décembre 2004 à 17:38:31 | Re : problème ontexte mémoire et classe

gregory6

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 :

ma classe rectangle

rectangle::rectangle()
{
}

rectangle::rectangle(int xx1, int yy1,int xx2,int yy2,int CB,int CF,CString text,int CT[3])
{
x1=xx1;
x2=xx2;
y1=yy1;
y2=yy2;
couleurBord=CB;
couleurFond=CF;
couleurText[0]=CT[0];
couleurText[1]=CT[1];
couleurText[2]=CT[2];
texte=text;
}


void rectangle::SetRectangle(int xx1, int yy1,int xx2,int yy2,int CB,int CF,CString text,int CT[3])
{
x1=xx1;
x2=xx2;
y1=yy1;
y2=yy2;
couleurBord=CB;
couleurFond=CF;
couleurText[0]=CT[0];
couleurText[1]=CT[1];
couleurText[2]=CT[2];
texte=text;
}

void rectangle::ModifCouleurFond(int i)
{
couleurFond=i;
}


void rectangle::Dessiner(CDC& dcMem, CPen* ppinceau[7],CBrush* pbrosse[6])
{
CBrush* pOldBrush;
CPen* pOldPen;
CRect rect(x1,y1+3,x2,y2+3);
pOldBrush=dcMem.SelectObject(pbrosse[couleurFond]);

pOldPen=dcMem.SelectObject(ppinceau[couleurBord]);
dcMem.Rectangle(x1,y1,x2,y2);

LOGBRUSH logbrush;
pbrosse[couleurFond]->GetLogBrush( &logbrush );
dcMem.SetBkColor(logbrush.lbColor);
dcMem.SetTextColor(RGB(couleurText[0],couleurText[1],couleurText[2]));

dcMem.DrawText(texte,texte.GetLength(),&rect,DT_CENTER);

dcMem.SelectObject(pOldBrush);
dcMem.SelectObject(pOldPen);
}


ici j'appelle ma classe, elle dessine bien le rectangle mais pas le texte.

rectangle rect3(50,80,190,240,1,1,"TEXTE",ct);
rect3.Dessiner(dcMem,pinceau,brosse);


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.

En tout cas, merci pour ton aide.

++
mercredi 22 décembre 2004 à 17:43:41 | Re : problème ontexte mémoire et classe

ymca2003

essaye en mettant des couleurs brutes dans le code (genre rouge pour le texte et blanc pour le fond pour vérifier que c'est pas un problème de couleur
mercredi 22 décembre 2004 à 20:00:50 | Re : problème ontexte mémoire et classe

gregory6

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.

Si t'as une autre idée je cherche de mon coté.

Merci

++
mercredi 22 décembre 2004 à 20:33:21 | Re : problème ontexte mémoire et classe

gregory6

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.

Merci
Bonne soirée


++
jeudi 23 décembre 2004 à 09:01:09 | Re : problème ontexte mémoire et classe

ymca2003

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.
jeudi 23 décembre 2004 à 10:30:19 | Re : problème ontexte mémoire et classe

gregory6

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.

en tout cas merci pour tes explications. C sympa.

++
jeudi 23 décembre 2004 à 11:00:23 | Re : problème ontexte mémoire et classe

ymca2003

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

1 2

Cette discussion est classée dans : ligne, int, dessiner, cdc, dcmem


Répondre à ce message

Sujets en rapport avec ce message

conversion [ par coyotedef ] salut!!lors de la compilation de mon code une erreur apparait. impossible de trouver un remede. "cannot convert parameter 1 from 'char [10]' to 'char' Optimiser algo Find Replace [ par crocejf2000 ] Salut a tous,Dans mon éditeur, j'ai fait un find-replace, il est un peut lent donc si vous avez des algo qui vont plus vite c'est pas de refus : int N pb classe [ par JediMaster ] j'ai créé un tableau dynamique dans une classe comme ca:class MaClasse{public: int m_largeur; int m_hauteur; int** m_tableau; MaClasse(int lar,int hau retour à la ligne [ par msoin ] 'jour, je debute en c++ et je fais quelques petits programmes pour voir comment ça marche.en l'occurence, celui ci:int main(){int loopcount;cout &lt lecture de flux et conversion de données [ par amin79 ] J'ai un fichier texte "donnees.txt" contenant les données suivantes :1 4 62 7 9 3 2 19 4 8 17où la première colonne désigne le n° d'une tâche, la deux pb de contexte mémoire [ par gregory6 ] bonjour je développe sous visual c++ et les MFC.je créé une classe ds laquelle j'utilise la fonction suivante : elle affiche une valeur tapé au clavie tableau a 2 dimensions [ par minet03 ] Bonjour, ceux qui ont eu l'occasion de me parler sur #Programmation vont surement me détester à jamais, mais voilà j'ai encore un problème avec ce tab assembleur en ligne avec gcc [ par nalk_deen_mook ] Bonjour j'aurais aimé savoir pourquoi lorsque je compile ce bout de code, j'ai une erreur de segmentation merci d'avance#include int main(){  int a=10 Dev C++ me poses des problèmes [ par Sneakito ] Bon voilà,j'ai un projet à réaliser et j'utilise Dev C++ sur un environement Windows.Je décide de tester cet éditeur par une premiere fonction très si Conversion int en string [ par EagleEye ] Bonsoir ! J'ai un pti soucis en fait il m'est impossible d'effectuer cette instruction car nbLigne est un int. itoa existe mais il ya plus simple nan


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales