Dessiner un rectangle dans la fenêtre principale de l'application [Résolu]

27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 8 sept. 2009 à 17:23 - Dernière réponse : espoire2v 3 Messages postés mardi 20 avril 2010Date d'inscription 25 décembre 2011 Dernière intervention
- 22 nov. 2011 à 22:00
Bonjour,

Je suis nouveau sur le forum, alors excuser moi si je n'adopte pas la bonne méthode...

Voilà, je développe une application en C++ avec une architecture MFC sous Visual Studio 2003.

J'aimerai savoir comment on peut faire pour dessiner tout simplement un rectangle (ou autres formes) dans la fenêtre principale de l'application.

--------------------------------------Code :----------------------------------------------------------------------

Voici les méthodes que j'ai essayé :
CPoint m_FirstPoint;
CPoint m_FirstPoint2;
m_FirstPoint.x = 100 ;
m_FirstPoint.y = 100 ;
m_FirstPoint2.x = 100;
m_FirstPoint2.y = 100;
CRect m_EnclosingRect;
m_EnclosingRect = CRect(m_FirstPoint, m_FirstPoint2); // Définit le rectangle délimiteur
m_EnclosingRect.NormalizeRect();

---------------
OU alors une autre méthode trouver sur le net :
---------------

CDC* pDC;
pDC = m_pMainWnd->GetDC();

pDC->Rectangle(100,100,100,100);


et après je fais un SHOW de l'application.

-------------------------------------------------------------------------------------------------------------------

Cependant ces deux méthodes ne fonctionne pas je ne visualise rien...


Merci à tous ceux qui pourront me filer un petit coup de pattes :)

Bonne soirée à tous et merci vos réponses

Adri
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 14 sept. 2009 à 17:52
3
Merci
Bonsoir,

dsl du temps de réponse, mais weekend oblige !

J'ai réussi à dessiner mes rectangles. En fait je les aient crées directement dans une méthodes à part, car j'avais du mal à gérer la méthode OnPaint (j'ai une architecture logicielle complexe ...
Donc voici le code que j'ai inséré dans la méthode createRectangle()

CDC *pDC ;
pDC = AfxGetApp()->m_pMainWnd->GetDC();
pDC->Rectangle((int)(tempPos.first),(int)(tempPos.second),(int)(tempSize.first),(int)(tempSize.second));
pDC->SetBkMode(TRANSPARENT);

tout simplement ...
En fait j'avais un problème au départ sur le pDC ; résolu avec l'aide de ed73 !! (merci bcp d'ailleur), petite fonction mais qui à son importance !

Voilou , merci encore à toi ed73 , et à charge de revanche !

A bientôt
Adri

Merci 27adri27 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de 27adri27
ed73 276 Messages postés lundi 8 septembre 2008Date d'inscription 15 avril 2013 Dernière intervention - 9 sept. 2009 à 11:56
0
Merci
Bonjour,

Ton dessin doit être réalisé au moment où la fenêtre se dessine, pour cela il faut dériver la méthode OnDraw.

void MyClass::OnDraw(CDC* pDC)
{
pDC->Rectangle(100,100,100,100);
}
Commenter la réponse de ed73
27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 9 sept. 2009 à 12:47
0
Merci
Merci pour ta réponse, c'est sympa !
J'ai essayé ta méthode, mais je n'y arrive pas... Pourrais tu me dire quel message windows tu utilises (ON_WM_???)
car pour récupérer pDC il n'y a que ON_WM_ERASEBKGND(); et dessiner le rectangle dedans ne marche pas..

J'ai une deuxième question : est ce que l'on est obliger de passer par ces méthodes, ne pourrais t on pas dessiner un rectangle dans une autre méthode après que la fenêtre soit créer ?

Merci pour tes réponses.

Passe une bonne journée

Adri
Commenter la réponse de 27adri27
ed73 276 Messages postés lundi 8 septembre 2008Date d'inscription 15 avril 2013 Dernière intervention - 9 sept. 2009 à 13:06
0
Merci
La méthode OnDraw est une méthode virtuelle de la classe CWindow, tu dois donc la dériver à l'aide du Class Wizard (Ctrl + W).

Si tu veux passer par les messages, alors il faut utiliser WM_PAINT et la fonction BeginPaint pour récupérer un pDC :

PAINTSTRUCT ps;
CDC *pDC = BeginPaint(&ps);
pDC->Rectangle(100,100,100,100);
EndPaint(&ps);

Il est bien sûr possible de dessiner dans la fenêtre une fois qu'elle est créée, il y a plusieurs possibilités.

- Invalider la fenêtre ou une partie avec InvalidateRect, ce qui va envoyer un WM_PAINT.
- Utiliser GetDC, ce que tu avais fait au début, mais il faut que ta fenêtre soit visible avant.

De toutes manières, il faut tout le temps utiliser la méthode de dessin de toute la fenêtre, OnDraw ou WM_PAINT, lorsque la fenêtre doit se redessiner entièrement, par exemple quand elle change de taille ou quand elle était cachée par une autre fenêtre.
Commenter la réponse de ed73
27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 9 sept. 2009 à 14:47
0
Merci
Je te remercie de ton aide, je vais essayer de faire comme tu me le préconises. Je te tiens au courant, en bien comme en mal (j'espère en bien!).
Merci encore,
Bonne journée

Adri
Commenter la réponse de 27adri27
27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 10 sept. 2009 à 17:47
0
Merci
Bonsoir,
Bon j'ai essayé ta solution, mais ça ne marche pas... Je ne dois pas être très doué parce que là je sèche complètement ...
Voilà j'ai essayé tes deux méthodes mais sans succès, alors que la première à l'air simple, je n'y arrive pas, il n'y a rien de dessiner...
Je suis en architecture MFC avec des backgrounds ... peut etre que ça vient de là?...
Si tu as une idée ou un conseil, je suis preneur !
Merci encore
Bonne soirée

Adri
Commenter la réponse de 27adri27
ed73 276 Messages postés lundi 8 septembre 2008Date d'inscription 15 avril 2013 Dernière intervention - 11 sept. 2009 à 00:05
0
Merci
Bonsoir,

Il y a juste une chose à laquelle je n'ai pas fait attention dans ton premier code, il ne faut pas écrire

pDC->Rectangle(100,100,100,100);

car dans ce cas le rectangle fait 0 pixels de large et 0 de haut

Par contre si tu écris

pDC->Rectangle(100,100,200,200);

alors tu afficheras bien un carré de 100 pixels. Tous ce que j'ai écrit précédemment reste donc valable à part ce détail
Commenter la réponse de ed73
27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 11 sept. 2009 à 10:46
0
Merci
Salut,
Merci de tes conseils, c'est un peu mieux..
Bon il y a du nouveau, c'est un peu mieux, mais pas concluant....
Voici ce que le code que j'ai inséré dans OnPaint( )

CDC *pDC ;
pDC = AfxGetApp()->m_pMainWnd->GetDC();
pDC->Rectangle(100,100,200,200);

C'est nikel, j'ai un beau rectangle de dessiner, cependant, je n'ai plus de background, mais pire, l'appli plante au bout de 5 secondes, et apparemment, il ne connait pas HDC, m_Hdc ... j'ai regardé dans l'aide, chercher un peu partout, mais sans réel avancée...

En tout cas merci pour ton aide, je continue à chercher et te tiens au courant de mes exploits de développeur !

Adri
Commenter la réponse de 27adri27
27adri27 8 Messages postés lundi 1 juin 2009Date d'inscription 14 septembre 2009 Dernière intervention - 14 sept. 2009 à 17:54
0
Merci
Dsl juste pour finir, le pb avec la méthode OnPaint était le rafraichissement trop régulier qui me faisait planté l'appli (car j'ai bcp de rectangle à dessiner )


Adri
Commenter la réponse de 27adri27
espoire2v 3 Messages postés mardi 20 avril 2010Date d'inscription 25 décembre 2011 Dernière intervention - 22 nov. 2011 à 22:00
0
Merci
salut tous le monde je suis nouvel dans le forum.
j'ai vraiment besoin d'aide je suis vraiment bloquer
je doit faire une carte d'environement pour naviguer un robot mobile pour cela je doit :
faire un rectacle qui doit avoire la dedans des autre rectagle avec autre couleur ( pour représenter les obstacle) tous ça sous visual c++ 6 "MFC"
Commenter la réponse de espoire2v

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.