Api win32

Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
- - Dernière réponse : cs_AlexMAN
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
- 27 nov. 2004 à 12:48
je cherche a creer une zone dans une fenetre dans laquelle l'on puisse afficher des trucs basiques (lignes, rectangles pleins ou vides,...)
y-a-t-il un controle qui existe, sinon, comment en creer un???
Afficher la suite 

11 réponses

Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
Il te faut créer une fenetre (CreateWindow(Ex)()) et ensuite dessiner dessus avec des fonctions tels que Rectangle(), LineTo()...etc. Je pense que tu devrais commencer par regardes des sources sur le site, et si tu as le courage et la motivation, de lire petzold (a telecharger sur brunews.free.fr)..

Voila, bonne chance !

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
Salut,
Pas besoin d'un controle.
Tu dois d'abord obtenir un handle de device context (HDC) pour la fenêtre sur laquelle tu veux dessiner :
HDC hdc=GetDC(hWnd); // hWnd=handle de la fenêtre

Tu utilises ce HDC pour dessiner des rectangles etc... :
Rectangle(hdc,10,10,150,100);//desine un rectangle vide
RECT rect;
rect.top=rect.left=10;
rect.bottom=rect.right=100;
HBRUSH hBrush=CreateSolidBrush(RGB(255,0,0));
FillRect(hdc,&rec,hBrush);//carré plein rouge

Moi aussi je te conseille de lire le Petzold, tu y trouveras tout ce qui concerne la programmation des fenêtres.
Commenter la réponse de racpp
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
racpp > Ce serait mieux de lui conseiller de dessiner a la reception de WM_PAINT :

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
//Dessins..
EndPaint(hwnd, &ps);
return 0;

Car sinon, a la premiere 'invalidation' de la fenetre, pouf, plus de rectangle ! Petzold est vraiment TRES agreable a lire, et l'anglais qu'il utilise est 'simple', donc serieux, fonce !

Bonne chance

++

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
Salut,
AlexMan > Si les dessins sont figés au lancement de la fenêtre, ta solution est convenable. Mais si le programme doit dessiner pendant son exécution suivant des paramètres entrés par l'utilisateur par exemple, les fonctions de dessin doivent être appelées en dehors du message WM_PAINT. En effet, ce dernier n'est reçu par la fenêtre que lorsqu'elle revient au premier plan (ou à la suite d'un appel à une fonction comme RedrawWindow() etc...). C'est vrai que le problème du rafraichissement de la fenêtre se pose. Pour moi, la meilleure solution est d'utiliser un metafichier en mémoire. Au lieu de dessiner directement sur la fenêtre, on dessine sur un metafichier créé avec CreateEnhMetaFile(). Cette fonction retourne un HDC comme celui d'une fenêtre. On affiche ce métafichier là où on veut sur notre fenêtre mère avec PlayEnhMetaFile(). Pour le rafraichissement, il suffit d'appeler la fonction d'affichage du metafichier durant le traitement du message WM_PAINT. Ce n'est pas compliqué et c'est parfait.
Commenter la réponse de racpp
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
racpp > Pkoi doivent elles etre placées en dehors de WM_PAINT ? Dans un truc que je suis en train de faire, des que l'utilisateur entre un parametre, je fais un InvalidateRect() et toutes mes fonctions de dessin (une demi douzaine d'appels) sont placés dans WM_PAINT, est ce une bonne solution ?

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7
0
Merci
AlexMan > Oui c'est une bonne solution aussi, mais dans ce cas encore les paramètres entrés doivent être définis en dehors de WM_PAINT. Ce qui conduit à l'utilisation de variables globales (ou en static dans la procédure). Si le nombre de ces variables est grand ça devient un peu gênant. Dans ma méthode de programmation j'essaie toujours d'éviter au maximum ce genre de variables. Je préfère ainsi que les variables soient définies (et parfois même déclarées) juste avant l'appel des fonctions. L'autre problème c'est qu'on appellera toutes les fonctions contenues dans le traitement de WM_PAINT même si on n'a besoin que d'une seule. Pour éviter cela on sera amené à ajouter des tests (et des variables). J'ajoute encore que si les dessins sont un peu complexes le rafraichissement de la fenêtre devient trop lent. Bref, ce sont des choses que j'ai vécu avant de découvrir l'astuce des métafichiers. Grâce à ces derniers, le programme devient plus performant et mieux organisé. Pour les dessins complexes, on n'affiche le métafichier qu'une fois le dessin terminé. Pendant le rafraichissement de la fenêtre, on n'a pas besoin de tout redéssiner, on affiche juste le métafichier d'un seul coup. Cela offre, en plus beaucoup d'autres avantages: sauvegarde des dessins dans un fichier (.emf de très petite taille), les imprimer, avoir un aperçcu avant impression ou faire un zoom etc... C'est pour tout cela que je pense que c'est la meilleure solution.
Commenter la réponse de racpp
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
Ok jte remercie pour ces explications, c tres simpa, merci.
Je prends note, et vais decouvrir cette methode...

Merci encore, Bonne soirée

++

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
2
0
Merci
merci a tous pour ces quelques conseils, je voudrai creer un affichage qui se raffraichi souvent, en fait, c 2 compteur, avec donc 2 aiguilles representées par 2 triangles, voila.
sa risque donc de sacader ou de clignoter, mé je v lire pedzold, voir ce qu'il y a d'interressant, et j'ai aussi trouvé une source win32 sur ce site, parlant du dessin dans une fenetre...
Commenter la réponse de s@ldon
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
Pour eviter le clignotement, utilise ou bien la methode de racpp, ou bien le 'double buffering', méthode exploitée par gagah ou encore aardman.
Si tu as besoin de precisions concernant cette derniere, fais moi signe.

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
140
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 septembre 2009
2
0
Merci
aaa ouais, jen aurais bien besoin, je veut bien de l'aide.
jonathan_detchart@hotmail.com si ta msn, je t'expliquerai mon projet en détail.
merci beaucoup...
Commenter la réponse de s@ldon
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
1
0
Merci
J'ai pas de msn installé, dsl. Et conseil, ne donne pas ton adresse comme ca sur le web, tu vas etre pourri de spam...Enfin bon bref, parenthese finie, voila la methode :

Ca consiste simplement a 'dessiner' dans un hdc en memoire, et de tt rebalancer dans le hdc de ton application en un seul coup, ca evite le clignotement.
Je te fournis le squelette suivant a mettre dans ta winproc :

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);
hdcmem = CreateCompatibleDC(hdc); //Crée le HDC memoire
hbmp = CreateCompatibleBitmap(hdc, rct.right, rct.bottom); Crée un HBITMAP
//Associe le HBITMAP (necessaire pour le dessin) a ton HDC memoire
holdbmp = SelectObject(hdcmem, hbmp);

//Exemple de dessin (rct obtenu par GetCLientRect(hwnd, &rct))
FillRect(hdcmem, &rct, hbrG);

//Balance tout sur le HDC de ton application
BitBlt(hdc, 0, 0, rct.right, rct.bottom, hdcmem, 0, 0, SRCCOPY);

SelectObject(hdcmem, holdbmp);
//Suppime les objets créés
DeleteObject(hbmp);
DeleteObject(holdbmp);
DeleteDC(hdcmem);
EndPaint(hwnd, &ps);

Voila, c pas compliqué du tt.

Bonne chance

++

+2(p - n)
Commenter la réponse de cs_AlexMAN