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

MFC Discussion :

Pb d'insertion dynamique de composants dans fct CALLBACK


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut Pb d'insertion dynamique de composants dans fct CALLBACK
    Voila, j'ai un serieux souci.

    Dans un Framework en C#.
    Je souhaite ajouter dynamiquement un composant dans un panel.
    Le composant en question est un composant utilisateur qui n'ai constitué que de labels, boutons et panel (un truc simple).

    Dynamiquement je souhaite en insérer plusieurs (un par un) dans un panel.
    Et lors du panel.Controls.Add(myComponent) j'ai le message d'erreur suivant qui apparait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Une exception non gérée du type 'System.ArgumentException' s'est produite dans system.windows.forms.dll
     
    Informations supplémentaires : Les contrôles créés sur un thread ne peuvent pas être parents d'un contrôle d'un autre thread.
    Je ne comprend pas grand chose à l'erreur.

    L'ajout de ce composant se fait apres l'appel d'une fonction CallBack dans un framework C++ qui fait ensuite appel a ma fonction d'ajout de composant, je ne sais pas si pas peut venir de ca.



    Le pire est que j'ai déjà réussi a ajouté plusieurs fois ce composant dans un autre panel apres l'appui sur un bouton.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    						myComponent = new ControlNoteComponent(this, iControlNoteMidi);
    						if( null != myComponent )
    						{
    							panelPlay.Controls.Add(myComponent);
     
    							//positionnement du control
    							int width = myComponent.Width;
    							myComponent.Location = new Point( (myChannel - 1) * Width ,0);
    						}
    Petite info supplémentaire:
    L'ajout du composant via un bouton ce fait dans un panel qui se trouve dans une tabpage. Et l'ajout du composant par la fonction CallBack se fait sur un autre panel d'une autre tabpage. Est ce que ca peut venir de ca?


    Je suis un peu pommé là

    Merci

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    a rien dit

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par hiko-seijuro
    t dans le mauvais forum la
    :s
    Et si parce qu'il parle de C++...

    Citation Envoyé par Akta3d
    L'ajout de ce composant se fait apres l'appel d'une fonction CallBack dans un framework C++ qui fait ensuite appel a ma fonction d'ajout de composant, je ne sais pas si pas peut venir de ca.
    Ok mais quel est le code C++ ?
    POur exploiter .NET il faut utiliser _gc comme directive , voir les nombreuses FAQ sur DVP

    Les fonctions CALLBACK c'est en général utiliser pour les procédures de messages pour fenêtre de type dialogue et je doute qu'on puisse utiliser cela avec le framework .NET

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Oui désolé, j'aurais surement du me mettre dans le forum .Net, mais comme d'hab je suis un peu préssé et je cherchais C# comme intitulé de forum.


    En fait j'utilise une fonction CALLBACK midiInProc pour recevoir des signaux midi. Tout ceci ce passe dans un framework C++.

    Mon framework C# ne me sert que pour gérer mon IHM.

    Voici le code C++:
    le .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void CALLBACK midiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 );
    dans le .cpp
    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
    33
    34
     
    	void CALLBACK midiInProc( HMIDIIN hMidiIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 )
    	{
    		int toto;
     
    		if( MIM_DATA == uMsg )
    		{	
    			NoMidiProject* myNoProj = (NoMidiProject*)dwInstance;
    			if( 0 != myNoProj )
    			{
    				MidiProject* myProj = myNoProj->GetMidiProject();
    				if( 0 != myProj )
    				{
    					if( 0 != myProj->_Itf )
    					{
    						int channel = (dwParam1 & 0x0000000F) + 1;
    						int control = (dwParam1>>8) & 0x000000FF;
    						int valeur = dwParam1 >> 16;
    						int status = (dwParam1 & 0x000000F0) >> 4;
     
    						//affichage de la valeur recu
    						myProj->_Itf->AfficherMessage(channel, control, valeur, status);
     
    						//recherche du ControlNoteMidi concernant le message
    						ControlNoteMidi* myControlNoteMidi = myProj->GetControlNoteMidi(channel, control);
    						if( 0 != myControlNoteMidi )
    						{
    							myProj->_Itf->AfficherControlMidi(myControlNoteMidi);
    						}
    					}
    				}
    			}
    		}
    	}
    Il y a t-il moyen de déclarer la fonction en managé??? ce qui m'étonnerai.

    Sinon la fonction AfficherMessage ne fait que afficher les valeurs channel, control, valeur, status dans des labels. Cette fonction est dans le framewok C# et elle marche nickel.
    Par contre c'est la fonction AfficherControlMidi qui plante.


    et voici le code C# qui gere mon IHM:
    (legerement simplifié pour exposé mon probleme)

    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
     
    		public void AfficherControlMidi(ControlNoteMidi iControlNoteMidi)
    		{
    			if( (null != iControlNoteMidi) )
    			{
    				int myChannel = iControlNoteMidi.GetChannel();
     
    				ControlNoteComponent myComponent = new ControlNoteComponent(this, iControlNoteMidi);
    				if( null != myComponent )
    				{
    					panelPlay.Controls.Add(myComponent);
     
    					//positionnement du control
    					int width = myComponent.Width;
    					myComponent.Location = new Point( (myChannel - 1) * width ,0);
    				}
    			}
    		}

    J'ai essayer de contourné le probleme en créant tous les ControlNoteComponent avant de commencer a acquerir mes signaux midi. Ce qui était faisable car je sais que j'aurais au maximum 16 ControlMidiComponent. Puis quand je recois mon signal je met simplement a jour le bon ControlNoteComponent.

    Ce coup ci le code va un peu plus loin. Mais dans la mise a jour de ce composant, il doit créer d'autres composants (NoteMidiComponent) à inserer dans ce ControlNoteComponent. Et la j'ai le meme message d'erreur. Par contre je ne peu plus contourné le probleme car ce coup ci je ne peux pas prévoir le nombre max de composant qu'il y aura a insérer.

    Auriez vous une piste pour contouné une nouvelle fois le probleme. Ou se qui serait encore mieux, une solution a mon erreur.


    Sinon pour en revenir a ma fonction callback. J'ai decidé d'utiliser cette methode car la fonction openMidiPort me le permettait avec le flag CALLBACK_FONCTION. Mais elle permet aussi d'autre type de flag que je n'ai pas explorer comme CALLBACK_THREAD et CALLBACK_WINDOWS. Cela pourrai -t- il me regler le probleme?

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Pas trop le temps désolé ; mais en C# c'est pas possible d'appeler directement les fonctionnalités MIDI et multimédia ?

Discussions similaires

  1. Insertion dynamique d'images dans crystal report avec c# 3.5
    Par devvanjier dans le forum Windows Forms
    Réponses: 0
    Dernier message: 08/12/2009, 18h35
  2. Insertion dynamique de textbox dans un gridview
    Par ahmedmido dans le forum ASP.NET
    Réponses: 1
    Dernier message: 06/08/2008, 13h11
  3. Réponses: 3
    Dernier message: 02/06/2008, 08h42
  4. Ajouter dynamiquement un composant dans un panel ou une popup
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 21/04/2008, 16h08
  5. insertion dynamique de lignes dans un tableau
    Par loreleï85 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/06/2006, 17h32

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