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 averti
    Inscrit en
    Ao�t 2006
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 39
    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
    Par d�faut
    salut,
    ce code n'a rien a voir avec les MFC ...
    c'est du C++/CLI .net.

  3. #3
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 39
    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
    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 averti
    Inscrit en
    Ao�t 2006
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 39
    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
    Par d�faut
    un bouton WPF a une autre signature.
    Essaie avec RoutedEventHandler et RoutedEventArgs

  7. #7
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 39
    Par d�faut
    Exactement,

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

    Merci beaucoup.

  8. #8
    Membre averti
    Inscrit en
    Ao�t 2006
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 39
    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 averti
    Inscrit en
    Ao�t 2006
    Messages
    39
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 39
    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