Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Bonjour,
Je souhaite récupérer l'ensemble des options de menu lancées par un utilisateur. J'ai pensé, sans succès, gérer un évènement sur le champ _Menu.

Merci de vos lumières.

Contribution le : 21/06/2006 14:49
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
05/06/2003 14:23
De Québec
Post(s): 511
Salut,

En memoire ou en fichier ?

Ou je suis on gere comme une gestion d'activite que l'on memorise dans un fichier hyper file avec le code utilisateur, l'option, la date et l'heure.

a+++

Contribution le : 21/06/2006 18:25
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Bonjour Océans.
je ne me pose pas encore la question du stockage... Il s'agit bien en effet de comptabiliser chauqe lancement pour proposer une liste limitée de raccoucis proposant les options les plus utilisées par utilisateur.

Je sais le programmer dans chaque option (un petit traitement qui va enregistrer l'information) mais je souhaite en passer par un evènement pour des raison évidente de portabilité et de simplicité en maintenance.

Par conséquent, je prends volontier le n° du message "Sélection d'une option de menu" qui correspond au code qu'on lui a affecté.

Contribution le : 22/06/2006 08:25
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour R&B,

J'ai testé de brancher un évènement sur _MENU mais résultat = rien ou plantage de l'appli suivant l'évènement.

Pas de soluce pour le moment...

Bon dév.,

Totof

Contribution le : 22/06/2006 09:28
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
L'idée a fait son chemin... J'ai pensé simplement brancher un évènement clic (laché de bouton gauche) sur la fenêtre et afficher le MoiMeme..Nom. Mais cela ne fonctionne pas sur un menu. Je vais devoir décortiquer MSDN...

Contribution le : 30/06/2006 10:43

Edité par R&B sur 30/6/2006 11:26:34
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
19/01/2004 13:48
De www.sigmasys.fr
Post(s): 988
Bonjour R&B,

J'avais fait le même test : brancher un évenement sur le menu mais _EVE.nom ne renvoie pas le nom du menu sélectionné... dommage.

Bon dév.,

Totof

Contribution le : 30/06/2006 11:30
_________________
[ Totof(Christophe LOGEL) réalise des développements spécifiques WinDev (Mon annonce wdforge), http://www.sigmasys.fr]
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Hum... de mon coté cela ne marche pas du tout (joli erreur !). Fais suivre ta déclaration... peut être une petite chose nous échappe. et si on pouvais au moins récupérer le handle !

Pour info en wd10 _Eve.xxx sont conservée par compatilité.
Pour le nom il faut en passer par MoiMeme..Nom

Sinon il y a cela... mais on n'est pas rendu !

Contribution le : 30/06/2006 11:58
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Hum Hum...
Plus je cherche, plus cela me semble compliqué !
En effet les menus sont en fait des collections et l'interception des sélection consiste alors en l'interception de chaque évènement clic des options du menu.

Peut-être un défi pour un concepteur d'activeX/dll qui permettrait de déclencher un traitement (en callback) en plus du traitement de chaque option.

http://msdn2.microsoft.com/fr-fr/library/system.windows.forms.menuitem.click.aspx

Cela devrait consister à parcourir la collection des menuitems et ajouter ce traitement aux clic de chaque menuitem...

Contribution le : 30/06/2006 14:30
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
A mon avis il est beaucoup plus simple de subclasser la fenêtre WinDev afin de pouvoir traiter directement les messages adhoc à savoir:
WM_MENUCOMMAND
WM_MENUSELECT

Contribution le : 30/06/2006 14:47
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
C'est bien WM_MENUCOMMAND qu'il me faut sub classer.
En effet WM_MENUSELECT est inutile pour surveiller les choix utilisateurs.

Mais comment classer précisément ?
PS : je suis joignable en privé (fomude contact) pour approfondissement.

Sinon, pour information, j'ai mis au point une classe opérationnelle qui rescence les choix d'options de menu principal (entre autre).

Contribution le : 30/06/2006 15:50

Edité par R&B sur 30/6/2006 16:48:17
Edité par R&B sur 30/6/2006 16:48:37
Edité par R&B sur 30/6/2006 16:49:35
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
J'ai du mal à comprendre l'avantage qu'il y a créer des classes pour encapsuler des appels de l'API.

Voici comment faire en pure SDK.

//Dans la partie Déclarations globales de la fenêtre principale écrire
gnPrevproc is int

//Dans la partie Initialisation de la fenêtre principale écrire
// On subclasse la fenêtre principale pour pouvoir prendre la main sur WinDev.
gnPrevproc = SetWindowLong(gnhMain, GWL_WNDPROC, &WndProc)

//Dans la partie Fermeture de la fenêtre principale écrire
IF gnPrevproc THEN
   SetWindowLong(gnhMain, GWL_WNDPROC, gnPrevproc)
   gnPrevproc = 0
END

//Dans la partie Procédures locales de la fenêtre principale créer la fonction callback
FUNCTION WndProc(nhWnd is int, nMsg is int, nwParam is int, nlParam is int)
nRet is int
SWITCH nMsg
    CASE WM_MENUCOMMAND
    // Ecrire votre code ici
    CASE etc.
END
IF gnPrevproc THEN
   nRet = CallWindowProc(gnPrevproc, nhWnd, nMsg, nwParam, nlParam)
END
RESULT nRet

//-------------------------------------------
// Encapsulation de l'API "SetWindowLong"
FUNCTION SetWindowLong(nHandle is int, nIndex is int, nNewValue is int)
nRet is int = API("USER32", "SetWindowLongA", nHandle, nIndex, nNewValue)		
RESULT nRet

//-------------------------------------------
// Encapsulation de l'API "CallWindowProc"
FUNCTION CallWindowProc(nPrevProc is int, nHandle is int, nMsg is int, nwParam is int, nlParam is int)
nRet is int = API("USER32", "CallWindowProcA", nPrevProc, nHandle, nMsg, nwParam, nlParam)
RESULT nRet


Contribution le : 30/06/2006 18:43
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
DSI WDF
Inscrit:
13/02/2006 16:52
Post(s): 266
Pourquoi ne pas tout simplement créer une procédure avec le nom du menu lancé en paramètre...

La portabilité se fera trés bien puisque le code ne sera qu'à un seul endroit.

Certes l'appel de la procédure sera présent dans chaque appel du menu, mais je ne vois pas ou est le problème au niveau débogage.

Enfin bon, c'est ce que je ferais perso, même si de meilleurs solutions doivent existées...

Bon courage...

Contribution le : 04/07/2006 08:15
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Citation :
Certes l'appel de la procédure sera présent dans chaque appel du menu, mais je ne vois pas ou est le problème au niveau débogage


C'est précisément ce que je souhaite éviter. evidement, J'ai déjà le mécanisme par une classe et un superchamp pour proposer le lien vers les 10 options les plus utilisées par l'utilisateur.

Mais je n'ai pas du tout cette programmation qui oblige à devoir penser à ajouter ceci ou cela à chaque option de menu. Ce raisonnement fonctionne quand on est seul sur des petits projets mais devient une source considérable de dysfonctionnement dès qu'on est plusieur et a fortiori sur de gros projets où les contraintes s'ammoncellent.

Je remercie donc Zapsol pour sa maîtrise et espère trouver une bonne âme pour transposer cela en WD (et me faire passer au mail). La ressource résultante sera evidement mise en ligne et documentée.

Contribution le : 05/07/2006 09:10
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
>>pour transposer cela en WD ???
Je suppose que vous voulez dire comment traduire le code en français, car c'est déjà du WD.

Dans l'environnment WinDev faire :
- menu "Code"
- "Langue du code" ---> "Convertir en français..."

//Dans la partie Déclarations globales de la fenêtre principale écrire
gnPrevproc est entier

//Dans la partie Initialisation de la fenêtre principale écrire
// On subclasse la fenêtre principale pour pouvoir prendre la main sur WinDev.
gnPrevproc = SetWindowLong(gnhMain, GWL_WNDPROC, &WndProc)

//Dans la partie Fermeture de la fenêtre principale écrire
SI gnPrevproc ALORS
	SetWindowLong(gnhMain, GWL_WNDPROC, gnPrevproc)
	gnPrevproc = 0
FIN

//Dans la partie Procédures locales de la fenêtre principale créer la fonction callback
FONCTION WndProc(nhWnd est entier, nMsg est entier, nwParam est entier, nlParam est entier)
nRet est entier
SELON nMsg
	CAS WM_MENUCOMMAND
	// Ecrire votre code ici
	CAS etc.
FIN
SI gnPrevproc ALORS
	nRet = CallWindowProc(gnPrevproc, nhWnd, nMsg, nwParam, nlParam)
FIN
RENVOYER nRet

//-------------------------------------------
// Encapsulation de l'API "SetWindowLong"
FONCTION SetWindowLong(nHandle est entier, nIndex est entier, nNewValue est entier)
nRet est entier = API("USER32", "SetWindowLongA", nHandle, nIndex, nNewValue)		
RENVOYER nRet

//-------------------------------------------
// Encapsulation de l'API "CallWindowProc"
FONCTION CallWindowProc(nPrevProc est entier, nHandle est entier, nMsg est entier, nwParam est entier, nlParam est entier)
nRet est entier = API("USER32", "CallWindowProcA", nPrevProc, nHandle, nMsg, nwParam, nlParam)
RENVOYER nRet


A noter que le w-langage étant du p-code le subclassement d'une fenêtre WinDev est nettement moins rapide que l'utilisation de la fonction native "Evènement".
Donc je vous conseille de faire un essai avec "Evènement" avec le message WM_MENUCOMMAND.

Contribution le : 05/07/2006 09:35
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
DSI WDF
Inscrit:
13/02/2006 16:52
Post(s): 266
je crois que l'on peut à partir de windev récupérer le nom de l'élément actif à partir d'une fonction.

C'est pourquoi, si cela existe, sur l'évènement clic relaché, tu lance ton enregistrement des 10 dernièrs choix du menu.

Contribution le : 05/07/2006 14:49
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Merci Zapsol (silc)

Machou : merci mais précisément on ne peut pas récupérer les évènements sur les champs menus... A mois de traiter séparément chaque option du menu (ce que j'avoue ne pas avoir testé et qui serait simple).

Des nouvelles à suivre donc.

Contribution le : 05/07/2006 17:29
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Salut Zapsol.
Il me manque une paire de choses.
La valeur numérique de WM_MENUCOMMAND (pas trouvée)
et comment affecter gnhMain dans :
gnPrevproc = SetWindowLong(gnhMain, GWL_WNDPROC, &WndProc)


Ma question : WM_MENUCOMMAND ne passe que si le dwStyle du MENUINFO et à MNS_NOTIFYBYPOS (cf ici). Evidement je ne sais l'évaluer/affecter

Contribution le : 06/07/2006 09:56
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Champ menu d'une fenêtre
WM_MENUCOMMAND = 294

//A mettre dans la partie déclarations globales de votre fenêtre
gnhMain is int = Handle()

WM_MENUCOMMAND Notification
The WM_MENUCOMMAND message is sent when the user makes a selection from a menu.

Syntax

WM_MENUCOMMAND

WPARAM wParam
LPARAM lParam;

Parameters

wParam
Specifies the zero-based index of the item selected.
Windows 98/Me: The high word is the zero-based index of the item selected. The low word is the item ID.

lParam
Handle to the menu for the item selected.
Return Value

No return value.
Remarks

The WM_MENUCOMMAND message gives you a handle to the menu—so you can access the menu data in the MENUINFO structure—and also gives you the index of the selected item, which is typically what applications need. In contrast, the WM_COMMAND message gives you the menu item identifier.

The WM_MENUCOMMAND message is sent only for menus that are defined with the MNS_NOTIFYBYPOS flag set in the dwStyle member of the MENUINFO structure.

Pour modifier MENUINFO utilisez l'API
SetMenuInfo

Pour obtenir le handle de votre menu utilisez l'API GetMenu de la façon suivante :
hMenu is int = API("User32", "GetMenu", gnhMain)

Contribution le : 07/07/2006 09:44

Edité par zapsol sur 7/7/2006 10:00:02
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2