OVH Cloud OVH Cloud

pas evident a expliquer

10 réponses
Avatar
seb-seb
bonjour
je suis en train de faire un genre de menu dans une fenetre speciale
en fait le clic sur un bouton execute la procedure dans un module qui
affiche la fenetre de menu
avec les boutons en parametres
quand on deplace la souris le bouton survolé est en surbrillance
et quand on lache le clic sur un bouton ca renvoie le bouton appuyé a la
premiere form
enfin ca c'est la theorie (lol)
en gros un menu popup aurait pu faire quasiment la meme chose mais c tout
petit et on peux pas changer la police

ca fait une paire de jours que je bloque à un endroit :
en fait quand le lache le clic j'unload la form avec les boutons
donc j'intercepte form_mouseup
mais c pas assez général
des que je sors de la fenetre d'origine la fenetre reste affichée

en gros je veux que quand on sorte de la fenetre d'origine ou de celle qui
contient les boutons
(sachant que celle qui contient les boutons peut etre plus grande que la
premiere)
ca unload celle des boutons
pas tres clair ptete mais merci a ceux qui pourront m'aider

10 réponses

Avatar
François Picalausa
Bonjour/soir,

"seb-seb" a écrit dans le message de
news:%
en gros je veux que quand on sorte de la fenetre d'origine ou de
celle qui contient les boutons
(sachant que celle qui contient les boutons peut etre plus grande que
la premiere)
ca unload celle des boutons



Quelquechose comme
Private Sub Form_Deactivate()
Unload Me
End Sub
?
Sauf que si on passe à une autre application, ça ne fonctionne pas.
Mais en sous classant la fenêtre pour le message
WM_ACTIVATE et en testant que wParam = WA_INACTIVE, ça devrait fonctionner.

Tu peux aussi jeter un oeil du côté de
http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/Popup_Menu_ActiveX_DLL/article.asp
ou encore
http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/PopupMenu_-_OwnerDraw_Menu_Items/article.asp

Ce qui t'évitera de devoir réimplémenter tout le context menu...

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
ng
Salut,

Pour ce genre (enfin d'après ce que j'ai compris) de fenêtre, j'ai tantot
utilisé ce code :

Desactive est un timer

Private Declare Function GetActiveWindow Lib "user32" Alias
"GetActiveWindow" () As Long

Private Sub Desactive_Timer()
If GetActiveWindow <> Me.hWnd Then
Unload Me
End If
End Sub

Qui permet donc, de manière fiable, de décharger une fenêtre qd celle ci n'a
plus le focus.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

seb-seb wrote:
bonjour
je suis en train de faire un genre de menu dans une fenetre speciale
en fait le clic sur un bouton execute la procedure dans un module qui
affiche la fenetre de menu
avec les boutons en parametres
quand on deplace la souris le bouton survolé est en surbrillance
et quand on lache le clic sur un bouton ca renvoie le bouton appuyé a
la premiere form
enfin ca c'est la theorie (lol)
en gros un menu popup aurait pu faire quasiment la meme chose mais c
tout petit et on peux pas changer la police

ca fait une paire de jours que je bloque à un endroit :
en fait quand le lache le clic j'unload la form avec les boutons
donc j'intercepte form_mouseup
mais c pas assez général
des que je sors de la fenetre d'origine la fenetre reste affichée

en gros je veux que quand on sorte de la fenetre d'origine ou de
celle qui contient les boutons
(sachant que celle qui contient les boutons peut etre plus grande que
la premiere)
ca unload celle des boutons
pas tres clair ptete mais merci a ceux qui pourront m'aider


Avatar
Zoury
Salut Nicolas! :O)

Private Declare Function GetActiveWindow Lib "user32" Alias



J'utiliserais plutôt GetForegroundWindow() qui renvoit la fenêtre active
actuelle, parce que GetActiveWindow() renvoit la fenêtre active *dans le
processus qui l'utilise*...

voici un petit test :
'***
' Form1
' 1 Timer
Option Explicit

Private Declare Function GetForegroundWindow _
Lib "user32" _
() As Long

Private Declare Function GetActiveWindow _
Lib "user32" _
() As Long

Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = "Foreground = " & GetForegroundWindow & " : Active = "
& GetActiveWindow
End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
ng
Cela est vrai, mais c'est effectivement ce dont j'avais besoin dans mon
appli.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Zoury wrote:
Salut Nicolas! :O)

Private Declare Function GetActiveWindow Lib "user32" Alias



J'utiliserais plutôt GetForegroundWindow() qui renvoit la fenêtre
active actuelle, parce que GetActiveWindow() renvoit la fenêtre
active *dans le processus qui l'utilise*...

voici un petit test :
'***
' Form1
' 1 Timer
Option Explicit

Private Declare Function GetForegroundWindow _
Lib "user32" _
() As Long

Private Declare Function GetActiveWindow _
Lib "user32" _
() As Long

Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = "Foreground = " & GetForegroundWindow & " :
Active = " & GetActiveWindow
End Sub
'***


Avatar
Zoury
> Cela est vrai, mais c'est effectivement ce dont j'avais besoin dans mon
appli.



Ah! je viens de relire ton code et oui en effet GetActiveWindow fonctionne..
je crois que c'est la comparaison qui m'avait mêlé... j'avais oublié que
GetActiveWindow renvoyait 0 lorque l'appli n'avait pas le focus.. ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
seb-seb
qu'est-ce que vous appelez "sous classer"
merci

"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

"seb-seb" a écrit dans le message de
news:%
> en gros je veux que quand on sorte de la fenetre d'origine ou de
> celle qui contient les boutons
> (sachant que celle qui contient les boutons peut etre plus grande que
> la premiere)
> ca unload celle des boutons

Quelquechose comme
Private Sub Form_Deactivate()
Unload Me
End Sub
?
Sauf que si on passe à une autre application, ça ne fonctionne pas.
Mais en sous classant la fenêtre pour le message
WM_ACTIVATE et en testant que wParam = WA_INACTIVE, ça devrait


fonctionner.

Tu peux aussi jeter un oeil du côté de



http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/Popup_Menu_ActiveX_DLL/article.asp
ou encore



http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/PopupMenu_-_OwnerDraw_Menu_Items/article.asp

Ce qui t'évitera de devoir réimplémenter tout le context menu...

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
seb-seb
une question :
ou trouvez vous comment utiliser les api et leurs fonctions
car apparament c'est assez pratique et ca fait tout
merci

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Nicolas! :O)

> Private Declare Function GetActiveWindow Lib "user32" Alias

J'utiliserais plutôt GetForegroundWindow() qui renvoit la fenêtre active
actuelle, parce que GetActiveWindow() renvoit la fenêtre active *dans le
processus qui l'utilise*...

voici un petit test :
'***
' Form1
' 1 Timer
Option Explicit

Private Declare Function GetForegroundWindow _
Lib "user32" _
() As Long

Private Declare Function GetActiveWindow _
Lib "user32" _
() As Long

Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = "Foreground = " & GetForegroundWindow & " : Active "
& GetActiveWindow
End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
François Picalausa
Bonjour/Soir,

Windows envoie des messages aux fenêtres (les fenêtres sont aussi les
contrôles). Ces messages sont par exemple WM_CLICKpour informer d'un click.
Chaque fenêtre a une "boucle de messages" qui traite ces messages.
En VB, la boucle sert à "convertir" les messages en événement (mais
uniquement certains messages...)
Depuis VB5, il existe l'opérateur addressof qui permet de récupérer
l'adresse en mémoire d'une procédure, ce dont les API de sous classement ont
besoin.
Le sous classement sert à intercepter les messages avant qu'ils ne soient
traités pour soit:
-Les "oublier" (par exemple, si on reçoit WM_CLICK, on peut l'intercepter et
le contrôle ne "saura" jamais qu'on l'a clické et on effectue aucune action)
-Les traiter (on fait comme pour les oublier sauf qu'on ajoute à ça une
action)
-Les laisser passer (donc, traitement normal)

Enfin, ça c'est en très gros... c'est un peu plus complexe que ça
Tu trouveras un exemple ici:
http://faq.vb.free.fr/index.php?question€

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"seb-seb" a écrit dans le message de
news:
qu'est-ce que vous appelez "sous classer"
merci

"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

"seb-seb" a écrit dans le message de
news:%
en gros je veux que quand on sorte de la fenetre d'origine ou de
celle qui contient les boutons
(sachant que celle qui contient les boutons peut etre plus grande
que la premiere)
ca unload celle des boutons



Quelquechose comme
Private Sub Form_Deactivate()
Unload Me
End Sub
?
Sauf que si on passe à une autre application, ça ne fonctionne pas.
Mais en sous classant la fenêtre pour le message
WM_ACTIVATE et en testant que wParam = WA_INACTIVE, ça devrait
fonctionner.

Tu peux aussi jeter un oeil du côté de






http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/Popup_Menu_ActiveX_DLL/article.asp
ou encore






http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/PopupMenu_-_OwnerDraw_Menu_Items/article.asp

Ce qui t'évitera de devoir réimplémenter tout le context menu...

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
seb-seb
j'ai pas tout compris (un peu quand meme ) mais je regarderais la page à
tête reposée

merci



"François Picalausa" a écrit dans le message de
news:
Bonjour/Soir,

Windows envoie des messages aux fenêtres (les fenêtres sont aussi les
contrôles). Ces messages sont par exemple WM_CLICKpour informer d'un


click.
Chaque fenêtre a une "boucle de messages" qui traite ces messages.
En VB, la boucle sert à "convertir" les messages en événement (mais
uniquement certains messages...)
Depuis VB5, il existe l'opérateur addressof qui permet de récupérer
l'adresse en mémoire d'une procédure, ce dont les API de sous classement


ont
besoin.
Le sous classement sert à intercepter les messages avant qu'ils ne soient
traités pour soit:
-Les "oublier" (par exemple, si on reçoit WM_CLICK, on peut l'intercepter


et
le contrôle ne "saura" jamais qu'on l'a clické et on effectue aucune


action)
-Les traiter (on fait comme pour les oublier sauf qu'on ajoute à ça une
action)
-Les laisser passer (donc, traitement normal)

Enfin, ça c'est en très gros... c'est un peu plus complexe que ça
Tu trouveras un exemple ici:
http://faq.vb.free.fr/index.php?question€

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"seb-seb" a écrit dans le message de
news:
> qu'est-ce que vous appelez "sous classer"
> merci
>
> "François Picalausa" a écrit dans le message de
> news:
>> Bonjour/soir,
>>
>> "seb-seb" a écrit dans le message de
>> news:%
>>> en gros je veux que quand on sorte de la fenetre d'origine ou de
>>> celle qui contient les boutons
>>> (sachant que celle qui contient les boutons peut etre plus grande
>>> que la premiere)
>>> ca unload celle des boutons
>>
>> Quelquechose comme
>> Private Sub Form_Deactivate()
>> Unload Me
>> End Sub
>> ?
>> Sauf que si on passe à une autre application, ça ne fonctionne pas.
>> Mais en sous classant la fenêtre pour le message
>> WM_ACTIVATE et en testant que wParam = WA_INACTIVE, ça devrait
>> fonctionner.
>>
>> Tu peux aussi jeter un oeil du côté de
>>
>



http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/Popup_Menu_ActiveX_DLL/article.asp
>> ou encore
>>
>



http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/PopupMenu_-_OwnerDraw_Menu_Items/article.asp
>>
>> Ce qui t'évitera de devoir réimplémenter tout le context menu...
>>
>> --
>> François Picalausa (MVP VB)
>> FAQ VB : http://faq.vb.free.fr
>> MSDN : http://msdn.microsoft.com




Avatar
ng
Il faut télécharger l'api-guide : http://www.allapi.net
(http://www.student.kuleuven.ac.be/~m0116986/3.7/agsetup.exe)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

seb-seb wrote:
une question :
ou trouvez vous comment utiliser les api et leurs fonctions
car apparament c'est assez pratique et ca fait tout
merci

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message
de news:
Salut Nicolas! :O)

Private Declare Function GetActiveWindow Lib "user32" Alias



J'utiliserais plutôt GetForegroundWindow() qui renvoit la fenêtre
active actuelle, parce que GetActiveWindow() renvoit la fenêtre
active *dans le processus qui l'utilise*...

voici un petit test :
'***
' Form1
' 1 Timer
Option Explicit

Private Declare Function GetForegroundWindow _
Lib "user32" _
() As Long

Private Declare Function GetActiveWindow _
Lib "user32" _
() As Long

Private Sub Form_Load()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = "Foreground = " & GetForegroundWindow & " :
Active = " & GetActiveWindow
End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -
http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à
tous