Api win32

s@ldon Messages postés 140 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 septembre 2009 - 25 nov. 2004 à 21:16
cs_AlexMAN Messages postés 1536 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???

11 réponses

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
25 nov. 2004 à 21:26
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)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
26 nov. 2004 à 00:25
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.
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
26 nov. 2004 à 06:56
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)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
26 nov. 2004 à 14:25
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.
0

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

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
26 nov. 2004 à 14:49
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)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
26 nov. 2004 à 17:17
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.
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
26 nov. 2004 à 17:36
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)
0
s@ldon Messages postés 140 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 septembre 2009 3
27 nov. 2004 à 11:32
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...
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 nov. 2004 à 11:35
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)
0
s@ldon Messages postés 140 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 septembre 2009 3
27 nov. 2004 à 12:37
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...
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 nov. 2004 à 12:48
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)
0
Rejoignez-nous