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 :

[MFC/ActiveX] Echange de données contrôle ocx <-> page de propriétés


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Par défaut [MFC/ActiveX] Echange de données contrôle ocx <-> page de propriétés
    Bonjour,
    débutant en programmation de composants ActiveX, je souhaite réaliser un contrôle destiné a être embarqué dans une application réalisée avec VB6. Ce contrôle a pour fonction de stocker une librarie d'images, utilisés par d'autres contrôles pour se dessiner.
    Lorsque je suis en mode design, je souhaite rajouter des images dans ce contrôle (que je nomme RQPuzzleList). Pour me faciliter la tâche, j'ai créé une page qui me permet d'aller chercher des images sur le HD, dont voici une capture, prise depuis le TestContainer de Visual C++.





    Cette page résulte de l'implémentation de la classe dérivée de COlePropertyPage que m'a généré le MFC ActiveX Wizard dans mon projet.
    A son niveau, je gère donc une liste de structures de type "RQPicture" :

    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
    // Item
    class RQPicture : public CObject // dérive de CObject pour utiliser Serialize
    {
    ...
    CString m_name;
    LPPICTURE mp_picture; // chargée via OleLoadPicture
    ...
    };
    
    // Gère une liste d'instances de RQPicture
    class RQPictureList
    {
    
    };
    C'est ici que ça se corse. J'aimerais transférer cette liste d'images au niveau de mon contrôle RQPuzzleList (qui lui même posséderait une liste RQPictureList), de sorte que celui-ci puisse les gérer et les sauver en tant que données persistentes (sérialisation). Ainsi à son rechargement, il les aurait à sa disposition et il serait possible de les éditer / modifier via cette page.
    D'après mes recherches sur ce forum et ailleurs, il semble que la page COlePropertyPage "dialogue" avec le contrôle ocx à travers la fonction DoDataExchange. J'ai bien réussi à récupérer/envoyer des données de types simples (BOOL, String, etc...) grace aux fonctions DDX_, DDP_ mais impossible de trouver quoi que ce soit pour des types custom.

    Mes questions sont les suivantes :

    1) Est-il possible d'échanger des données de type plus complexe (ici de type RQPictureList) entre un contrôle et sa page de propriétés?
    2) Comment peut-on sérialiser une image pour la sauvegarder en données persistentes du contrôle?
    3) Y'a-t-il une solution plus simple/évidente pour réaliser un tel composant ?

    Merci pour votre aide !

  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,
    dans le cas d'un ocx il faut distinguer les données persistantes propres à l'ocx c'est à dire stockées dans le fichier ressources .
    et les données externes dans un fichier de support.
    comment voulais tu que soit sauvegarder tes données ? :
    dans un fichier indépendant ou dans les ressources ?.

    dans un activex tu peux sauvegarder une image par l'intermédiaire d'un objet
    CPictureHolder ,la sauvegarde se passe ensuite dans la fonction:
    DoPropExchange(CPropExchange* pPX)
    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
        CPictureHolder Pic;
        Pic.CreateEmpty();
    CString *pstrCaption =(CString *)&((CString &)InternalGetText());
        if(pPX->GetVersion()>= (DWORD)MAKELONG(_wVerMinor, _wVerMajor))
        {        
            PX_Color(pPX,_T("BorderColor"),m_borderColor,12632256);
            PX_Color(pPX,_T("PanneauColor"),m_panneauColor,12632256);
    
            PX_Picture(pPX,_T("ControlPicture"),m_Pic,Pic);
      }
    else
    {    
        if(pPX->IsLoading())
        {                
            long type;            
            CString str;
            BOOL b;
            short int sh;
            OLE_COLOR olecolor;    
    
            PX_Color( pPX,_T("BorderColor"),olecolor,12632256);
            PX_Color(pPX,_T("PanneauColor"),olecolor,12632256);
    
            PX_Picture(pPX,_T("ControlPicture"),m_Pic,Pic);
    
        }
    mais cette fonctionnalité est liée au fait que tu inclus un controlpicture dans ton activex pas une liste..
    donc a mon avis il vaut mieux regarder la sérialisation dans un fichier.
    ça dépendra du type de fichier va traiter ton activex (bmp,jpeg ,etc).
    de ce point de vue la classe CImage est intéressante.
    le numéro d'identifiant du contrôle pourra être utilisé pour le nom du fichier.


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Par défaut
    Merci pour la réponse.
    Pour la question 1) , j'ai trouvé la solution. Il suffit de créer une proprieté "hidden" (nommé ici "ThisPointer") au niveau du contrôle ocx de type LONG, qui va avoir comme value this.

    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
     
    class CMyControl : public COleControl
    {
    ...
    // Généré par le class wizard
    LONG GetThisPointer(void);
    void SetThisPointer(LONG newVal);
     
    ...
    };
     
    LONG CMyControl::GetThisPointer(void)
    {
    ...
    return long(this);
    }
    Dans mon fichier .idl, je me retrouve avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    properties:
    [id(1), helpstring("property ThisPointer"), hidden] LONG ThisPointer;
     
    ...
    Ainsi, depuis ma page de propriétés, je peux accéder à mon contrôle ocx.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BOOL CMyPropPage::OnInitDialog()
    {
    ....
    // Get pointer to LONG
    long pOcxControl = 0;
    GetPropText(_T("ThisPointer"),&pOcxControl);
    mp_ocxControl = STATIC_DOWNCAST(CMyControl,CObject*)pOcxControl); // sauvé en membre de ma page 
    ....
    }
    Voilà ! J'espère que cela "tip" pourra aider quelqu'un.
    Je m'attaque à la sérialisation de la liste d'images.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Par défaut
    Salut, j'ai finalement créé mon composant gérant une liste d'images. La partie la plus ardue fut de sérialiser correctement cette liste puis de la sauver en tant que données persistentes au niveau du contrôle (pour retrouver mes images lors du chargement).

    Voici quelques code snippets qui trouveront peut-être écho à ceux qui ont le même problème. Le code n'inclut pas la totalité de l'implémentation, seulement les parties concernant la sérialization / sauvegarde dans une archive.


    Voilà!
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/07/2006, 12h18
  2. Réponses: 16
    Dernier message: 29/06/2005, 20h55
  3. [MFC] Driver base de donnée
    Par kor dans le forum MFC
    Réponses: 5
    Dernier message: 07/01/2004, 15h06
  4. echange de données php/flash
    Par ramses83 dans le forum Flash
    Réponses: 8
    Dernier message: 18/08/2003, 23h50
  5. [Kylix] Echange de données entre fiches
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 01/07/2003, 11h34

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