Dessiner un rectangle dans la fenêtre principale de l'application

Résolu
27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009 - 8 sept. 2009 à 17:23
espoire2v Messages postés 3 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 25 décembre 2011 - 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
A voir également:

10 réponses

27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009
14 sept. 2009 à 17:52
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
3
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
9 sept. 2009 à 11:56
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);
}
0
27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009
9 sept. 2009 à 12:47
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
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
9 sept. 2009 à 13:06
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009
9 sept. 2009 à 14:47
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
0
27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009
10 sept. 2009 à 17:47
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
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
11 sept. 2009 à 00:05
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
0
27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009
11 sept. 2009 à 10:46
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
0
27adri27 Messages postés 8 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 14 septembre 2009
14 sept. 2009 à 17:54
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
0
espoire2v Messages postés 3 Date d'inscription mardi 20 avril 2010 Statut Membre Dernière intervention 25 décembre 2011
22 nov. 2011 à 22:00
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"
0
Rejoignez-nous