julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 2008
-
18 sept. 2005 à 16:38
julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 2008
-
20 sept. 2005 à 21:58
Je cherche à sous classer une editbox pour modifier son affichage.
Je sous classe donc le message WM_PAINT pour pouvoir modifier l'apparence de l'editbox.
Cela fonctionne bien lors de la création de l'edit, mais des que je
donne le focus à l'edit et que je rentre du texte dedans, il doit faire
appel à un autre message, car il se dessine comme un edit normal.
Pour mes tests, j'avais simplement modifier la couleur de fond (je
sais, pour faire cela, il y a le message WM_CTLCOLOREDIT envoyé à la
fenetre parent), mais c'étatit pour tester.
Lors de ce test, à la création, je vois un editbox avec un fond de
couleur (message WM_PAINT bien intercepté), mais par la suite, des que
je rentre du texte dans l'editbox, ou meme que je clique dessus
pour lui donner le focus, mon fond redevient blanc (couleur par
défaut d'un editbox).
Savez quel message je dois intercepter
pour pouvoir effectuer un dessin permanent. A savoir que par la suite,
je souhaite mettre un bitmap en fond, donc la gestion du
WM_CTLCOLOREDIT ne suffit pas.
Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
Pour afficher ton bitmap comme fond de ton Edit, je pense qu'il faut
effectivement le sous-classer et utiliser la fonction BitBlt() ou
StretchBlt() durant le traitement de WM_PAINT. Je pourrai faire des
tests quand j'aurai un peu de temps.
julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 200815 19 sept. 2005 à 21:36
Merci a vous deux pour les réponses.
Brunews: L'idée est bonne, mais ne s'applique pas au projet. Je
souhaite en faite développer une série de fonctions réutilisables dans
divers programmes, et dessiner sur la fenetre mere ne me semble pas
etre une bonne solution, même si pour une application donnée, cela
convient parfaitement, j'en convient.
Racpp: J'avais déja regarder ta source. Avec celle-ci, je peux en effet
donner une couleur de fond à l'editbox par l'intermediaire du message
WM_CTLCOLOREDIT. Mais ca reste une couleur de fond et pas un bitmap.
J'ai deja sous classer le WM_PAINT de l'edit, mais rien a faire. Il
dessine bien ce que je lui donne lors du premier affichage de la
fenetre, mais des que je donne le focus à l'editbox, il remet le fond
de couleur renvoyé par WM_CTLCOLOREDIT. Et ne redessine jamai mon edit
avec l'image de fond initial..
Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 19 sept. 2005 à 21:47
Le edit fait un erasebackground avant d'afficher son texte par dessus, pour cela qu'il ne me semble pas y avoir de solution simplement avec un edit. Faudrait enregistrer ta propre classe de fenêtre et reproduire toute la logique du edit pour le texte, un immense boulot.
Au plus "simple" serait de faire une classe C++ qui prendrait un handle de edit en constructeur et créerait illico un static image aux dimensions du edit auquel tu mettrais illico le fond transparent. Ne se ferait pas en 2 lignes de code mais surement moins galère que reconstituer toute la logique d'un edit.
ciao...
BruNews, MVP VC++
Vous n’avez pas trouvé la réponse que vous recherchez ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 20 sept. 2005 à 05:58
Je viens de créer un petit programme de test et ça marche en traitant
le message WM_ERASEBKGND dans la procédure de sous-classement. L'image
bmp est affichée dans la zone cliente de l'Edit pendant le traitement
de ce message. Pour que cette image soit affichée après chaque clic ou
modification du texte de l'Edit, il suffit d'utiliser la fonction
InvalidateRect() dans le traitement du message WM_COMMAND de la fenêtre
parente. Voici le code complet:
Dans la procédure de
sous-classement IDB_BITMAP doit être remplacé par l'identificateur de
ton Bitmap en resoource. Si le bitmap a la même taille en pixels que la
zone cliente de l'Edit, tu peux utiliser la fonction BitBlt() au lieu
de StretchBlt(). Le code de cette procédure n'est pas très bien
optimisé car je l'ai fait juste pour voir si ça marche. A toi de
l'améliorer.