DC ou fenetre ?

Signaler
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
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

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Peut etre en sous classant le controle et en dessinant dans WM_PAINT...
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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

++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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).
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Ben j'ai essayé, mais sans succés.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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'.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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

++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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 !

++
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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...
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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 !
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
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 ...).