DC ou fenetre ?

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 14 sept. 2004 à 22:18
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 17 sept. 2004 à 20:27
Bonsoir,

Voila, je voux explik mon pb : je veux dessiner, 'sur' les controles d'une fenetre, un rectangle, mais j'ai un ptit souci sur comment dessiner en sachant qu'avec les 3 methodes suivantes, j'ai des soucis :
-Recup le HDC du controle lui mm, et dessiner sur celui-ci (bof, ca c nul, et ca marche po tres bien)
-Recup le HDC de l'ecran (GetDC(NULL)) et dessiner 'sur' le controle (fonctionne mais n'efface pas les traits précedemment dessiné, comment faire ?)
-Creer une fenetre en forme de rectangle et la superposer au controle (n'apparait pas tt le temps, mm en HWND_TOPMOST...)

Si quelqu'un pouvait me guider dans le choix d'une de ces 3methodes, jle remercie..

Merci

++

12 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 sept. 2004 à 22:31
Salut,
Peut etre en sous classant le controle et en dessinant dans WM_PAINT...
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
14 sept. 2004 à 22:35
Ah pardon, j'ai pas tres bien posé ma kestion : je veux dessiner sur le controle de n'importe kel fenetre, en fait, on se fout de la fenetre (parente) puis ce ke je recup directement le handle du controle a partir de WindowFromPoint.

J'ai aussi oublié de dire que si "mes" methodes ne sont pas bonnes, n'hesitez pas a men donner d'autres..

Merci aardman

++
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 sept. 2004 à 23:22
Salut,
Mouais... si c'est pour dessiner sur des fenetres qui ne sont pas dans ton processus le sous-classement est pas adapté.

Sinon pour la methode avec GetDC(null):
tu dis que les traits précedemment dessiné ne sont pas effacés, peut etre que tu peux forcer le controle a se redessiner pour effacer les traits ? (UpdateWindow).
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
15 sept. 2004 à 15:51
Ben j'ai essayé, mais sans succés.
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 sept. 2004 à 13:25
Dessiner sur le DC de l'écran, ca semble pas très raisonnable...
Fais un sous-classement du controle. Dans WM_PAINT de la WndProc, appelle d'abord CallWindowProc avec Proc par défaut pour le dessiner normalement, puis dessine ce que tu veux.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 sept. 2004 à 15:50
Salut,
Le probleme c'est que le hwnd de la fenetre est récupéré directement avec WindowFromPoint, ca peut donc etre une fenetre d'un autre processus, auquel cas le sous classement ne pourra pas etre fait 'simplement'.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 sept. 2004 à 15:58
Ah oui j'avais lu que le premier message. Dans ce cas je vois exactement ce que AlexMAN veut faire, et il faut bien utiliser le GetDC(0).
AlexMAN> Je te montre ca ce soir si tu veux
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
17 sept. 2004 à 19:37
Ok chef pas de pb (dsl de pas t'avoir rpd au mp, jfais ca de suite).

aardman > Si tu te sens de m'expliker comment on fait le sous classement d'un controle par son hwnd (ou un lien ou autre), je veux bien m'y atteler, paske avec ce genre de truc, c vraiment la porte ouverte a tte les fenetres...

Merci d'avance

Merci vecchio

++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
17 sept. 2004 à 19:38
ou vecchio, j'y pense, si tu peux m'eclairer sur la marche a suivre, et pas tt me donner comme ca, ce serait sympa, paske jmré bien le faire tt seul moi... merci !

++
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 sept. 2004 à 20:07
Salut,
En gros ca consiste a remplacer la wndproc par defaut du controle par une wndproc a toi. Pour cela il suffit de changer l'addresse de la wndproc de la fenetre avec SetWindowLong et d'ecrire une callback spécialement pour cette fenetre. Il faut aussi penser a appeler CallWindowProc a la fin de ta wndproc pour que le message soit traité par la wndproc par defaut (sauf si tu veux volontairement bloquer le message).

C'est expliqué sur le site d'Iczelion:
http://win32assembly.online.fr/tut20.html
et sur MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/WindowProcedures/UsingWindowProcedures.asp

et aussi dans Petzold il me semble...
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
17 sept. 2004 à 20:11
ok tu m'explik le sous classement, ca ya pas de pb, mais tu dis plus haut kon peut sous classer un controle d'un autre process, mais comment ? j'ai une ptite idée, mais la c vraiment pas simple !
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 sept. 2004 à 20:27
Salut,
Au contraire j'ai dis qu'on pouvait pas sous classer une fenetre d'un autre processus.
Le pointeur vers ta wndproc est valide dans ton processus, mais pas dans les autres...
Pour que ca marche il faudrait que le pointeur vers ta wndproc soit valide dans le contexte du procesus qui a créé la fenetre, et je pense qu'on pourrait faire ca en metant la wndproc dans une dll et en chargeant la dll dans le processus (mais ca fait quand meme compliqué juste pour dessiner un truc ...).
0
Rejoignez-nous