OVH Cloud OVH Cloud

Creer des menus.

19 réponses
Avatar
Dan
Bonjour à tous.
Je débute sur ce nouveau langage.
J'ai développé précédemment en Visual Basic et je voudrais convertir mes
applications en C ou C++.
Pourriez-vous m'indiquer un site dans lequel serait expliqué la création de
menu et de boutons clicable pour que je puisse mesurer la difficulté de la
tâche.
Maintenant s'il existe un logiciel capable de convertir mes applications et
des en langage C ou C++ je suis évidemment preneur dans un premier temps,
mon but est de toutes façons de comprendre la procédure.
Dans Visual Basic la boîte à outils permet de créer des fenêtres avec des
boutons, je ne trouve rien de cela dans Microsoft Visual studio six que je
possède.
D'avance merci de votre aide

9 réponses

1 2
Avatar
Marc Boyer
On 2008-01-25, Mickaël Wolff wrote:

Je te conseille :
http://www.gtkmm.org/


Je rebondis car le choix d'une API graphique est typiquement une de
mes préoccupations du moment. Je ne trouves rien qui me conviennes.
Enfin si, mais BeOS est mort, et Haiku n'est pas encore exploitable. Et
puis ce ne serait pas portable...

Existe-t-il un API graphique permettant le genre de chose suivantes :

class MyWindow : public gapi::Windows
{
virtual void onclose() ;
}

Et que onclose soit la méthode appelée lorsque la fenêtre est fermée,
et ne pas avoir à utiliser une syntaxe lourdingue, à savoir connecter la
fonction à un événement. En C je comprends qu'il n'y ait pas le choix,
mais en C++, on a quand même une syntaxe permettant de faire facilement
de l'orienté objet.

[SNIP]


Est-ce moi qui ait une vision biaisée en raison de la Be API, ou
est-ce que cette habitude de connecter est la bonne ?


Je n'ai pas assez de recul pour dire que la connexion par ev est
*là* bonne solution, mais elle en a quand même pas mal.
Une première chose, c'est de séparer la hierarchie purement graphique
de la hierarchie de reaction.
Une seconde, c'est de permettre à une classe de gérer des evt venus
de différents endroits (associer la même réaction à un clic sur tel
bouton, sur tel menu, ou a tel raccourci clavier: par exemple 'Sauver').
Une autre particularité, liée, c'est de pouvoir faire des "controleurs"
specialisés par fonctionnalité.

J'ai peur (mais ce n'est qu'une impression) que ce que tu cherches
soit une bonne idée pour des mini-trucs, mais ne passe pas à l'échelle,
puisque le code associé à une fonctionnalité se retrouve dans un
fichier qui dépend d'un choix graphique: si on décide d'accéder
à telle partie par un click gauche au lieu d'un double click,
ou de faire une grille de boutons au lieu d'une liste défilante,
le code fonctionnel doit bouger.

Bien sûr, en informatique, tout peut se résoudre par un niveau
d'indirection en plus, et un "bon programmeur" saura se servir
de l'un comme de l'autre.

Bon, après, il faudrait avoir les retours de gens de BeOS sur le
sujet.


Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Fabien LE LEZ
On Fri, 25 Jan 2008 11:27:48 +0100, Sylvain Togni <"sylvain.togni at
visionobjects.com">:

L'argument est plus celui qu'explique James, si une fenêtre
possède 20 boutons, chacun associé à une action différente,
il est plus simple d'écrire 20 fonctions que 20 classes
différentes.


Note que le cas des boutons est justement géré différemment du reste
par Windows lui-même :
- Un message "normal" (par exemple, déplacement de la souris)
est envoyé au bouton lui-même (en fait, via l'héritage fenêtre ->
bouton).
- Quand l'utilisateur clique sur le bouton, Windows envoie un
message WM_COMMAND à la fenêtre parent du bouton (i.e. celle qui le
contient), avec l'identifiant du bouton en paramètre.

Du coup, dans un système basé sur les fonctions virtuelles, c'est
probablement une fonction de la fenêtre parent qui serait appelée lors
d'un clic sur le bouton.

Avatar
James Kanze
On Jan 25, 11:59 pm, Fabien LE LEZ wrote:
On Fri, 25 Jan 2008 11:27:48 +0100, Sylvain Togni <"sylvain.togni at
visionobjects.com">:

L'argument est plus celui qu'explique James, si une fenêtre
possède 20 boutons, chacun associé à une action différente,
il est plus simple d'écrire 20 fonctions que 20 classes
différentes.


Note que le cas des boutons est justement géré différemment du reste
par Windows lui-même :
- Un message "normal" (par exemple, déplacement de la souris)
est envoyé au bouton lui-même (en fait, via l'héritage fenêtre ->
bouton).
- Quand l'utilisateur clique sur le bouton, Windows envoie un
message WM_COMMAND à la fenêtre parent du bouton (i.e. celle qui le
contient), avec l'identifiant du bouton en paramètre.

Du coup, dans un système basé sur les fonctions virtuelles, c'est
probablement une fonction de la fenêtre parent qui serait appelée lors
d'un clic sur le bouton.


Ce qui veut dire qu'il faut un switch ou une serie d'if pour les
départager ? Pas très sioux, à mon avis.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Christophe Lephay
"James Kanze" a écrit dans le message de news:

On Jan 25, 11:59 pm, Fabien LE LEZ wrote:
Note que le cas des boutons est justement géré différemment du reste
par Windows lui-même :
- Un message "normal" (par exemple, déplacement de la souris)
est envoyé au bouton lui-même (en fait, via l'héritage fenêtre ->
bouton).
- Quand l'utilisateur clique sur le bouton, Windows envoie un
message WM_COMMAND à la fenêtre parent du bouton (i.e. celle qui le
contient), avec l'identifiant du bouton en paramètre.

Du coup, dans un système basé sur les fonctions virtuelles, c'est
probablement une fonction de la fenêtre parent qui serait appelée lors
d'un clic sur le bouton.


Ce qui veut dire qu'il faut un switch ou une serie d'if pour les
départager ? Pas très sioux, à mon avis.


Ben non, c'est toujours un method template, il me semble, dans lequelle on
appellerait la fonction de la classe de base avant la fonction de la classe
dérivée pour finir par envoyer le wm_command.


Avatar
Jean-Marc Bourguet
"Christophe Lephay" writes:

Ce qui veut dire qu'il faut un switch ou une serie d'if pour les
départager ? Pas très sioux, à mon avis.


Ben non, c'est toujours un method template, il me semble, dans lequelle on
appellerait la fonction de la classe de base avant la fonction de la classe
dérivée pour finir par envoyer le wm_command.


Je crois que James parle de classifier les différents wm_command possibles.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Sylvain
James Kanze wrote on 26/01/2008 11:49:
- Quand l'utilisateur clique sur le bouton, Windows envoie un
message WM_COMMAND à la fenêtre parent du bouton (i.e. celle qui le
contient), avec l'identifiant du bouton en paramètre.


Ce qui veut dire qu'il faut un switch ou une serie d'if pour les
départager ? Pas très sioux, à mon avis.


subjectif tout ça ...

certes (dans ce schéma) les N boutons d'un container exigeront N case
d'un switch dans la procédure (virtuelle) "onCommand" de ce container et
certes, si 'on' n'aime pas les switchs, cela peut être lourd.

pour autant, enregistrer dans la construction du container N fonctions
de callbacks pour chacun des boutons présents pourra paraitre aussi
lourd; cela peut même imposer des passages de contexte / paramètres non
élégants. (de plus ceci peut être mal commode voire impossible avec des
ressources graphiques pré-construites et ne s'appliquent qu'à des objets
d'interface entièrement construits à la main).

tu suggérais qu'il est possible de "gérer les évenements de
l'extérieur de l'objet", j'adhère à l'idée de "gérer" l'action par un
object tiers ou un process dédié mais je préfère (très généralement)
gérer l'évènement (non l'action qu'il déclenche) au plus proche de
l'élément visuel et donc par surcharge de l'objet graphique.

Sylvain.


Avatar
James Kanze
On Jan 26, 8:17 pm, Sylvain wrote:
James Kanze wrote on 26/01/2008 11:49:

- Quand l'utilisateur clique sur le bouton, Windows envoie un
message WM_COMMAND à la fenêtre parent du bouton (i.e. celle qui le
contient), avec l'identifiant du bouton en paramètre.


Ce qui veut dire qu'il faut un switch ou une serie d'if pour les
départager ? Pas très sioux, à mon avis.


subjectif tout ça ...

certes (dans ce schéma) les N boutons d'un container exigeront
N case d'un switch dans la procédure (virtuelle) "onCommand"
de ce container et certes, si 'on' n'aime pas les switchs,
cela peut être lourd.


Ça dépend. J'utilise volentiers des switch pour décoder des
entrées. Ici, en revanche, il me semble effectivement mal
placé. Au niveau plus bas, le système a déjà dû mappé la
position du curseur à l'évenemment. Alors, autant que faire,
pourquoi pas directement à un pointeur à un objet, plutôt qu'à
un enum ou quelque chose.

En fait, d'autres solutions sont possible aussi. Donc, par
exemple, chaque bouton est unique -- il a une étiquette
différente, un icon différent, etc. La solution de Swing (qui me
semble convenir assez ici, au moins dans certains cas), c'est
que la classe JButton lit ces informations de l'Action qui lui
est attachée. On régroupe donc tout qui varie selon le bouton.

(J'ajouterai que je connais les GUI surtout en Java. Où il est
nettement plus facile de créer une petite classe déléguée qui
renvoie à une fonction quelconque de la classe mère. C'est un
des rares cas où les « inner class » de Java améliore le code,
plutôt que de servir à l'obfuscation.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Sylvain
James Kanze wrote on 27/01/2008 12:47:

certes (dans ce schéma) les N boutons d'un container exigeront
N case d'un switch dans la procédure (virtuelle) "onCommand"
de ce container et certes, si 'on' n'aime pas les switchs,
cela peut être lourd.


Ça dépend. J'utilise volentiers des switch pour décoder des
entrées. Ici, en revanche, il me semble effectivement mal
placé. Au niveau plus bas, le système a déjà dû mappé la
position du curseur à l'évenemment. Alors, autant que faire,
pourquoi pas directement à un pointeur à un objet, plutôt qu'à
un enum ou quelque chose.


?!? je ne comprends pas ta remarque !...

en fait on parle ici d'un type de msg particulier pour un contrôle
particulier (un clic sur un bouton), ce seul cas est bien sur non
représentatif des problématiques et challenges d'une API graphique.

ceci étant, les boutons "à la windows" tels que décrit dans ce fil
génèrent bien un event "action" (comparable à un
java.awt.event.ActionEvent) reçu par la fenêtre container (qui par
comparaison agit comme un java.awt.event.ActionListener), sa méthode
"onCommand" ("actionPerformed") recevra donc simplement un identifiant
de la source (l'ID du bouton) mais pas la position du curseur ni autre
info bas niveau.

En fait, d'autres solutions sont possible aussi. Donc, par
exemple, chaque bouton est unique -- il a une étiquette
différente, un icon différent, etc. La solution de Swing (qui me
semble convenir assez ici, au moins dans certains cas), c'est
que la classe JButton lit ces informations de l'Action qui lui
est attachée. On régroupe donc tout qui varie selon le bouton.


certes mais ici tu considères les moyens de représenter un bouton (le
manipuler via une instance qui le caractérise); AWT, Swing, Qt et
wxwidgets - entre autres - fonctionnent comme cela, c'est à dire que ces
libs imposent l'utilisation d'une instance du "bouton" pour créer le
contrôle en question - la gestion de son action était alors "par
connexion" ou par broadcast d'évènement.

l'UI windows (Win32) ne fonctionne pas nécessairement ainsi, seul un
handle de fenêtre d'un type particulier (ici 'control', sous-type
'button') est requis; il n'y a donc (pour les cas simples, ie hors
remappage de ce handle sur une instance) aucun objet pour gérer le
contrôle, tous les comportements par défaut (y compris gestion d'une
chaine titre et réprésentation graphique) étant réalisés par une routine
de l'OS.

cette remarque sur le cas particulier des boutons ne doit pas masquer la
complexité d'une librairie portable de gestion d'UI.
cette complexité ne réside pas tant dans la définition d'une classe qui
permettra de fixer un titre, une icone, une couleur que dans le
traitement global des messages recus et générés par les contrôles; entre
le simple WaitNextEvent() de MacOS et la procédure-qui-fait-tout de
Windows il y a un monde ... avec X11 entre les 2.

Sylvain.


Avatar
Mickaël Wolff
Mickaël Wolff a écrit des choses qui ont générées des interventions
intéressantes.

Désolé de ne pas poursuivre la conversation, je reviendrais plus tard
quand j'aurais collecté plus d'éléments. Mais tout ce que vous dites est
fort intéressant.

Merci.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
1 2