Accueil > Forum > > > > gdi et dessin
gdi et dessin
mardi 28 octobre 2003 à 00:22:44 |
gdi et dessin

Arkko
|
Je dessine quelque chose sur mon dialog avec gdi (fonction Rectangle) et quand je la reduit et la remet ... le dessin s'efface ... mais le dessin est generer par l'utilisateur (ex. paint ) comment faire pour quil ne s'efface pas merci @+ arkko
|
|
mardi 28 octobre 2003 à 08:45:16 |
Re : gdi et dessin

garslouche
|
Il s'efface toujours puisque tu ne le vois plus à l'écran! En fait à chaque fois que la fenêtre réapparait elle émet WM_PAINT. C'est en captant cet événement que tu dois tout redessiné. Eventuellement tu peux enregistrer ton image dans un buffer à chaque fois que ta fenêtre est masquée et le remettre d'un coup quand elle réapparait (c'est plus ou moins ce qu'on appelle du double-buffering)
|
|
mardi 28 octobre 2003 à 12:04:25 |
Re : gdi et dessin

JCDjcd
|
T'es sur que c'est ce que l'on appelle le double buffering ??
Ici il n'y a pas deux buffer, non ?
En win32, tu dois etre capable a tout instant de redessiner une partie de ta fenetre sur demande de Windows. Celui-ci t'envoie un message WM_PAINT a ta procedure :
switch(iMsg) { case WM_PAINT: { HDC hdc; PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps); ... // tes operations graphiques // tu genres : MoveToEx(hdc,0,0,NULL); LineTo(hdc,50,50); EndPaint(hwnd,&ps); return 0; } }
|
|
mardi 28 octobre 2003 à 12:14:46 |
Re : gdi et dessin

garslouche
|
D'abord j'ai écrit que c'était plus ou moins du double-buffering....et en plus il y a deux buffers : celui qui est utilisé pour affiché à l'écran et celui où l'on écrit virtuellement.
|
|
mardi 28 octobre 2003 à 12:27:04 |
Re : gdi et dessin

JCDjcd
|
J'ai bien compris ce que tu as dis, mais je ne comprend pas : il n'y a qu'un buffer : celui dans lequel on ecrit <=> celui qui est afficher, non ?
On n'est pas en OpenGL, ou la effectivement il y a deux buffer.
|
|
mardi 28 octobre 2003 à 15:23:06 |
Re : gdi et dessin

garslouche
|
La technique du double buffering n'est pas spécifique à OpenGL ! C'est juste un truc qui évite de voir les différentes parties d'un composant graphique se dessiner au fur et à mesure. Le principe c'est qu'au lieu de dessiner à l'écran car partie d'un dessin on le fait dans un écran virtuel (le buffer). Une fois qu'on a terminé de dessiner dans le buffer on remplace l'affichage de l'écran par le buffer d'un seul coup. Ainsi ça ne clignote pas quand on efface des trucs ou quand il y a des animations, ...
|
|
mercredi 29 octobre 2003 à 00:25:18 |
Re : gdi et dessin

Arkko
|
Ouais mais mon programme c'Est un espece de paint (le user dessine) donc ds paint je ne peux pas vriament dessiner des rectangles :) la methode du buffering semble interessente .. pouvez vous me l'explique en profondeur avec du code si possible merci
|
|
mercredi 29 octobre 2003 à 09:56:11 |
Re : gdi et dessin

JCDjcd
|
//*********************************************** #include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //***********************************************
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) { static char szAppName[] = "ExemplePourArkko"; HWND hwnd; MSG msg; WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass); wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow( szAppName, // nom de la classe szAppName, // titre de la fenetre WS_OVERLAPPED | WS_SYSMENU, // style de la fenetre CW_USEDEFAULT, // position initiale en x CW_USEDEFAULT, // position initiale en y 512, // largeur initiale 512, // hauteur initiale NULL, // handle de la fenetre mere NULL, // handle du menu de la fenetre hInstance, // handle de l'instance NULL); // parametres de creation
ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) { static int cx,cy; switch (iMsg) { case WM_CREATE: { return 0; } case WM_SIZE: { cx = LOWORD(lParam); cy = HIWORD(lParam); break; } case WM_PAINT: { HDC hdc; PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps); Rectangle(hdc,cx/4,cy/4,3*cx/4,3*cy/4); EndPaint(hwnd,&ps); return 0; } case WM_DESTROY: { PostQuitMessage (0); return 0; } }
return DefWindowProc(hwnd,iMsg,wParam,lParam); }
|
|
mercredi 29 octobre 2003 à 14:05:12 |
Re : gdi et dessin

ymca2003
|
Si tu veux pouvoir redessiner à l'écran à tout momment ce que l'utilisateur à fait, il suffit de stocker son dessin dans un bitmap.
1) Au début d'un nouveau dessin, créer un DC et un bitmap en mémoire compatible avec le DC de la fenêtre (hWnd) où il sera affiché : HDC hdc = GetDC(hWnd); HDC hMemDC = CreateCompatibleDC(hdc); HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, cx, cy); HBITMAP hOldBmp = SelectObject(hMemDC, hMemBmp);
les variables hMemDC, hMemBmp et hOldBmp doivent être globale. hOldBmp servira pour restaurer l'état du GDI à la fin.
2) Ensuite, quand tu traite les opération de dessin de l'utilisateur, au lieu de dessiner dans le DC de ta fenêtre, utilise celui en mémoire (hMemDC), exactement de la même façon.
3) Quand la fenêtre aura besoin d'être dessinée, (message WM_PAINT), il suffit de recopier ton DC en mémoire :
HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, 0, 0, cx, cy, hMemDC, 0, 0);
EndPaint(hWnd,&ps);
4) Enfin, à la fin de l'appli, il faut libérer le DC: SelectObject(hMemDC, hOldBmp); DeleteObject(hMemBmp); DeleteDC();
Un conseille pour éviter un clignotement de l'écran lors des dessins : - Ne pas effacer le fond de l'écran mais celui du bitmap en mémoire puis le recopier. - Utiliser InvalidateRect(hWnd, NULL, FALSE);pour mettre à jour l'écran sans que le fond de l'écran soit effacer à haque fois.
|
|
mercredi 29 octobre 2003 à 14:06:57 |
Re : gdi et dessin

ymca2003
|
J'ai oublié un paramètre à la fonction BitBlt :
BitBlt(hdc, 0, 0, cx, cy, hMemDC, 0, 0, SRCCOPY);
|
|
Cette discussion est classée dans : gdi, dessin, efface
Répondre à ce message
Sujets en rapport avec ce message
[?] dessin en couleur sous visual C SDK [ par jetsam ]
Comment faire pour desiner une ligne en couler en Visual Cjuste en SDK (pas d'objet) avec un HDC
Au bord du suicide à cause des GDI et d'une Listbox [ par mzhunix ]
Bonjour à tous !J'ai un petit probleme concernant les gdi et l'affichage d'un bitmap sur une listbox. Le tous cree avec des api's et en langage C.En f
probleme offscreen en GDI [ par pipo ]
j'ai un soucis en GDI :ce que je veux, c'est de travailler sur une zone offscreen pour y animer/coller tout mon graphisme, puis de coller cette zone s
GDI : probleme de splitting en offscreen [ par pipo ]
j'ai un soucis en GDI :ce que je veux, c'est de travailler sur une zone offscreen pour y animer/coller tout mon graphisme, puis de coller cette zone s
CA VA TRÈs MAL ! ressource gdi [ par michelmt ]
j'ai fais un programme qui sert a comptécombien de pièce je peut entré dans une feuille de stratifieril me dessine les grandes feuilles puis y insertl
Registre [ par ideosphere ]
Bonjour je debute en c++ et je souhaite faire 1 soft ki efface l'hitorique d'IEVoila mon source (j'ai pas c/c les #includes etc...): void __fastcall T
GDI et fonction OnDraw [ par BarthOlivier ]
Salut a tous....J'ai une petite question concernant les routines graphique...Travaillant sous VB, je n'etais pas familiarisé avec les questions de con
GDI windows [ par moi1392 ]
Bonjour, j'ai un léger soucis avec l'API win32.Alors voila, je voudrais tracer un rectangle vide au milieu mais avec une certaine epaisseur de bord.La
GDI GetPixel trop LENT !!! [ par idk ]
bonjour, je voudrai savoir, si il y a pas moyen d eviter de faire un getPixel pour connaitre la couleur d un pixel ! Parce que cette fonction est supe
Dessin [ par LordBob ]
Bonjours a tous,voila je cherche un fichier header un peu comme 'econio.h' ou 'sconio.h' mais avec des fonctions supplémentaire comme par exemple, la
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|