Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour
Pour savoir si ma souris survole mon userobject, j'utilise l'événement 'pbm_mousemove', mais je ne sais pas comment capter le moment où je ne survole plus mon userobject...
Merci d'avance
Dernière modification par dark ryus (13-05-2011 15:14:06)
Hors ligne
Bonjour,
Tu peux adapter ceci à ton userobject en codant plutôt le mousemove de la fenêtre (ou autre objet qui le contient) : http://www.rgagnon.com/pbdetails/pb-0042.html
//[window mousemove event] // just to display something st_1.text = string(xpos) + ", " + string(ypos) IF xpos >= st_1.X AND (xpos <= st_1.x + st_1.Width) AND & ypos >= st_1.y AND (ypos <= st_1.y + st_1.Height) THEN st_1.textcolor = 255 ELSE st_1.textcolor = 0 END IF
Hors ligne
Je pensais à ça aussi, mais ça fait un peu lourd dans une fenêtre où il y a plein de boutons...
Hors ligne
Dans ce cas, code l'évenement mousemove (event id : pbm_mousemove) sur ton ancêtre de bouton.
Pourquoi tu as besoin du mousemove ? Si c'est pour les powerTip, il te suffit d'utiliser un pictureButton à la place du commandButton.
Edit : bon je viens de relire ta question.
Alors, c'est simple. Si l'evt mousemove est déclenché sur ta fenêtre, ça veut dire que la souris n'est plus sur un bouton...
Hors ligne
Je voulais éviter de passer par l'événement de la fenêtre mais je ne vais pas avoir le choix... merci
Hors ligne
je ne me souviens plus du code, mais de mémoire, dans l'évènement other, tu peux intercepter le code correspondant à l'action de quitter la zone de survol de l'objet avec le pointeur de souris...
A+
Vincent
Hors ligne
Dans l'event other de ton objet, tu peux coder ceci.
Dans les user event mousehover et mouseleave,
tu code ta modification de bitmap ou ce que tu veux déclencher au survol
et éloignement de l'objet par ton pointeur de souris...
constant ulong WM_MOUSEHOVER = 673 //0x02A1 constant ulong WM_MOUSELEAVE = 675 //0x02A3 choose case message.Number case WM_MOUSEHOVER this.TriggerEvent("mousehover") case WM_MOUSELEAVE ib_mouseover = false this.TriggerEvent("mouseleave") end choose
A+
Vincent
Vince le méchant modo t'a attrapé : balise code =pb (en minuscules)
Hors ligne
merci pour l'info mais à quoi correspond le message.Number ?
quand je l'affiche, ce n'est presque jamais le même et je n'ai pas les valeurs ci dessus
Dernière modification par dark ryus (11-05-2011 15:07:59)
Hors ligne
Bonjour,
J'ai développé pour notre application un certain nombre d'objets graphiques personnalisés à partir de userobject : onglets, boutons. Je pense que c'est ce que tu essayes de faire ?
Dans un userobject, je dépose 2 contrôles de type "picture" avec l'image correspondant à l'état inactif (p_inactif) non survolé par la souris et p_survole correspondant à l'image à afficher lorsque l'objet est survolé par la souris.
Pour ces 2 "picture" contrôles, j'ajoute à chacun un événement personnalisé ue_mousemove à faire correspondre avec l'événement id pbm_mousemove.
Dans le code de l'événement ue_mousemove de p_inactif :
p_survole.visible = TRUE this.visible = FALSE SetCapture(Handle(p_survole))
Dans le code de l'événement ue_mousemove de p_survole :
IF xpos < 0 OR xpos > this.Width THEN p_inactif.visible = TRUE this.visible = FALSE ReleaseCapture() RETURN 0 END IF IF ypos < 0 OR ypos > this.Height THEN p_inactif.visible = TRUE this.visible = FALSE ReleaseCapture() END IF
Note : SetCpature et ReleaseCapture sont 2 fonctions de l'API windows
Hors ligne
c'est exactement ça et ça marche, merci buck, je cherchais une solution depuis ce matin, tu viens de mettre de la joie dans mon début de soirée
Hors ligne
J'ai utilisé ta méthode buck (je t'ai envoyé un mp) mais j'ai quelques soucis.
Quand je met beaucoup de boutons dans une page, ça fait un peu guirlande de noel, ça clignotte de partout quand je bouge la souris.
J'ai un text sur mes bouton que je doit forcer à bringtotop = true car les 'visible' sur les événements mousemove me masque mon texte ....
Hors ligne
Utilise le fameux SetRedraw(False), SetRedraw(True) en début et fin de script pour éviter cet effet
Hors ligne
Bonjour,
Il m'est difficile de répondre sans avoir le code source. Par contre, tu utilises le contrôle standard pour afficher ton texte ou un "userobject" personnalisé genre uo_trans que l'on trouve sur le web pour afficher des textes sur fond transparent. J'ai supprimé cette objet de notre application par ce qu'il génère typiquement le comportement que tu viens de décrire.
Par contre, pour afficher les textes, j'ai créé deux événements personnalisés par image ue_paint que je fais correspondre avec l'événement id pbm_paint et ue_postpaint. Puis dans l'événement, ue_paint et getfocus du contrôle picture j'insère le code PostEvent("ue_postpaint").
Dans l’événement ue_pospaint, j'ai codé le nécessaire pour afficher le texte. Pour des raisons de charte graphique, j'avais besoin d'afficher le texte sur fond transparent l'objet uo_trans ne m'apportant pas satisfaction, j'utilise en fait des fonctions de l'API windows que j'ai encapsulé dans un wrapper en C++.
J'ai développé cette solution sous PB 7.0 dans les années 2000, je n'ai plus les idées tout à fait fraiche sur le sujet du pourquoi et du comment j'ai procédé ainsi, mais de souvenir peut-être bien pour les raisons que tu indiques. Je n'ai quasiment plus retouché au C++ depuis.
Hors ligne
En mettant beaucoup de bout de code en commentaire (presque tout ^^), je m'aperçoit que c'est à l'ouverture de ma page que ça clignote beaucoup jusqu'à ce que la page soit complètement chargé.
J'ai essayé de mettre des setredrow(false) dans le constructeur, ou dans un uo_postopen de la page mais rien n'y fait. Soit ma page ne se charge plus ^^, soit ya rien qui fonctionne.
Dernière modification par dark ryus (13-05-2011 09:47:54)
Hors ligne
Il ne faut pas oublier de mettre aussi un SetRedraw(True) plus tard.
Hors ligne
Je viens de m'apercevoir que c'est au changement d'un onglet que ça clignote le plus. On dirait qu'il fait des redraw pour tous les élément des onglets à chaque changement d'onglet.
Quand je sors mes boutons de la zone de l'onglet, plus de clignotement... le repaint de se fait que sur une zone ?
Dernière modification par dark ryus (13-05-2011 10:05:09)
Hors ligne
J'ai joué à mister magouille.
J'ai fait une datawindow pour le milieu de mon bouton, avec mon image de fond et et static text, et ça fonctionne pour la transparence
Hors ligne