IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

[débutant]gestion des Events


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut [débutant]gestion des Events
    Bonjour à tous,

    Tout d'abord je tiens a signaler que je suis vraiment novice en MFC... Ce que je souhaite faire c'est de parcourir un arbre construit à partir d'un fichier XAML, et pour chaque Control trouvé dans l'arbre lui associer une methode particuliere. Genre, s'il s'agit d'un bouton, lui ajouter un évènement OnClick() par exemple... un TextBox, TextChanged(), etc...

    Je parcours parfaitement mon arbre et trouve les controls, en revanche impossible d'ajouter des events aux controls...

    LoadXAML qui me permet de lire le fichier XAML et de construire l'arbre et de le parcourir en appelant BrowseXAMLTree():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    DependencyObject^ XAMLfile::LoadXAML()
    {
    	System::Collections::IEnumerable^ RootChildren;
     
    	System::Diagnostics::Debug::WriteLine("LoadXAML()");
     
    	//Create stream to read the XAML file
    	StreamReader^ mysr = gcnew StreamReader("page1.xaml");
     
    	//Create XAML tree according the XAML file
    	System::Windows::DependencyObject^ rootObject = static_cast<DependencyObject^> (XamlReader::Load(mysr->BaseStream));
     
    	//Get the children of the root element within the XAML tree
    	RootChildren = LogicalTreeHelper::GetChildren(rootObject);
     
    	//Browse the XAML tree
    	XAMLfile::BrowseXAMLTree(rootObject, RootChildren);
     
    	//return the DependencyObject which will be use to attach to the HWND source
    	return rootObject;
    }

    BrowseXAMLTree() qui parcourt l'arbre et pour chaque control trouvé ajoute une action en appelant AssociateActionToXAMLcontrol():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    void XAMLfile::BrowseXAMLTree(DependencyObject^ RootObject, System::Collections::IEnumerable^ RootChildren)
    {
    	bool loop = true;
     
    	//Get the children of the root
    	RootChildren = LogicalTreeHelper::GetChildren(RootObject);
     
    	//For all root's children, do...
    	do
        {
    		System::Collections::IEnumerator^ enumChild = RootChildren->GetEnumerator();
            if (enumChild->MoveNext())
            {
                RootObject = static_cast<DependencyObject^>(enumChild->Current);
     
    			//If the object is a UI control (some problem appear in the case of <control.property>
    			if (RootObject->GetType()->Namespace == "System.Windows.Controls")
    			{
    				System::Diagnostics::Debug::WriteLine(RootObject->GetType()->ToString());
    				XAMLfile::AssociateActionToXAMLcontrol(RootObject);
                    BrowseXAMLTree(RootObject, RootChildren);
                }
            }
            else
            {
    			loop = false;
            }
        }
        while (loop);
        return;
    }

    Maitenant je n'arrive pas a coder la fonction AssociateActionToXAMLcontrol()... Je l'avais déjà codé en C# et voici le code. Mais en MFC, j'ai tenté de faire pareil, mais le system d'event semble différent...

    Voici en C# le code basique aue j'avais fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
            private void AssociateAction(DependencyObject obj)
            {
                String objetType = obj.GetType().ToString();
                switch (objetType)
                {
                    case "System.Windows.Controls.Button":
                        System.Diagnostics.Debug.WriteLine("Action ajoutée au bouton");
                        ButtonXAML = obj as System.Windows.Controls.Button;
                        ButtonXAML.Click += new RoutedEventHandler(Button_Click);
                        break;
     
                    case "System.Windows.Controls.TextBox":
                        System.Diagnostics.Debug.WriteLine("Action ajoutée au TextBox");
                        TextBoxXAML = obj as System.Windows.Controls.TextBox;
                        TextBoxXAML.TextChanged += new System.Windows.Controls.TextChangedEventHandler(TextBox_TextChanged);
                        break;
     
                    default:
                        break;
                }
            }

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    ce code n'a rien a voir avec les MFC ...
    c'est du C++/CLI .net.

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Salut,

    Le problème c'est que mon application sur lequel je souhaite realiser la meme operation est une appli MFC...

    En gros, j'host dans mon appli MFC une partie WPF qui affciche le contenu d'un fichier XAML. Pour l'afficher ce contenu, je créé un arbre et le met en tant que RootVisual de l'Host.

    Je suis un peu perdu la

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    la facon de gérer les événements en C++/CLI est la meme qu'en C#
    il faut ajouter un EventHandler à ton controle, voir dans la faq C++/CLI http://dotnet.developpez.com/faq/cpp...dynamiccontrol

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Bon ba je crois que je suis une buse...

    Je n'arrive toujours pas a faire ce que je souhaite. Ma méthode AssociateActionToXAMLcontrol prend en argument un DependyObject^. Admettons que le type de ce DependencyObject^ soit un Button. Je souhaite donc attribuer à ce Button un Event Click.

    Voici ce que j'ai fais et qui ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void XAMLfile::AssociateActionToXAMLcontrol(DependencyObject^ obj)
    {
     
    	String^ objetType = obj->GetType()->ToString();
    	if (objetType->Equals((String^)"System.Windows.Controls.Button"))
    	{
    		Button^ ButtonXAML = gcnew Button();
    		ButtonXAML = reinterpret_cast<Button^> (obj);
    		ButtonXAML->Click += gcnew EventHandler(ButtonXAML, &XAMLfile::ButtonXAML_click);
                 }
    }
    Avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void XAMLfile::ButtonXAML_click(Object^ sender, EventArgs^ e)
    {
    }
    Voici les erreurs:

    error C3350: 'System::EventHandler' : a delegate constructor expects 1 argument(s)
    error C2664: 'System::Windows::Controls:rimitives::ButtonBase::Click::add' : cannot convert parameter 1 from 'System::EventHandler ^' to 'System::Windows::RoutedEventHandler ^'

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    un bouton WPF a une autre signature.
    Essaie avec RoutedEventHandler et RoutedEventArgs

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Exactement,

    J'ai changé par un RoutedEventHandler tout est ok.

    Merci beaucoup.

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Trop beau pour que cela dure...

    Lorsque je migre mon petit code qui fonctionnait là ou je souhaite voilà ce que j'obtiens. Pourtant je fais bien pointer la ou il faut non ?

    error C3364: 'System::Windows::RoutedEventHandler' : invalid argument for delegate constructor; delegate target needs to be a pointer to a member function

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Button^ ButtonXAML = gcnew Button();
    ButtonXAML = reinterpret_cast<Button^> (obj);
     
    //Attach ClickEvent to the Button
    ButtonXAML->Click += gcnew RoutedEventHandler(&XAMLfile::ButtonXAML_click);
    Avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void XAMLfile::ButtonXAML_click(Object^ sender, RoutedEventArgs^ e)
    {
    	Button^ ButtonXAML = gcnew Button();
    	ButtonXAML = reinterpret_cast<Button^> (sender);
    	System::Diagnostics::Debug::WriteLine(ButtonXAML->Name->ToString());
    }

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    J'ai tenté quelque chose totalement au hasard et ca fonctionne.

    J'ai déclaré ma fonction "XAMLfile::ButtonXAML_click" en static et ca passe...

    Si quelqu'un peut m'expliquer...

    Le problème c'est que si mes méthodes qui gèrent les evenements sont statiques alors je ne peux plus appeler les méthodes non static de ma classe...

    Comment résoudre ce problème ?

    Cordialement,
    Sacoum.

    EDIT: Probleme résolu, et j'ai répondu a mes question, j'arrête de vous ennuyer , hop TAG Résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Conception] classes internes ou gestion des events
    Par TTKiBosse dans le forum Général Java
    Réponses: 2
    Dernier message: 06/12/2006, 18h25
  2. [Débutant]Gestion des évènements souris
    Par bubu251 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 06/10/2006, 11h49
  3. Gestion des event avec un objet ole MsExcel
    Par rdemont dans le forum Delphi
    Réponses: 3
    Dernier message: 03/07/2006, 16h08
  4. Débutant: Gestion des références
    Par todobene dans le forum Langage
    Réponses: 2
    Dernier message: 07/06/2006, 07h32
  5. [C#] Gestion des Events d'un control Composite
    Par lord_paco dans le forum ASP.NET
    Réponses: 3
    Dernier message: 07/10/2005, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo