wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 4
Pub hébergeur
Pourquoi cette pub ?

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Système
» [D&D] Drag and Drop Text
Détails du snippet : [D&D] Drag and Drop Text
Informations sur l'auteur de ce snippet :


Hors ligne
Gandi (Membre)
Lieu: Clermont Ferrand
Inscrit le : 10-10-2007
Messages: 205
Snippets: 4
Tutoriels: 0
Introduction / Description :
Le drag & drop nécessite d'une source et d'une cible.

Pour créer une source pas besoin de dériver une classe il suffit juste d'écouter un évènement comme MouseLeftDown et de créer une wxDropSource avec le wxDataObject à envoyer.

Pour définir une cible il sera nécessaire de créer une classe dérivée pour implémenter le traitement sur les données reçu. (ATTENTION cette classe ne la faite pas dériver de wxWindow cf: explications plus bas )
Contenu du snippet :
Première chose savoir ce que l'on veut envoyer. Pour cela allé consulter l'explication de wxDataObject.

Au départ j'étais parti  pour envoyer directement le pointeur de l'objet, il m'aurait donc fallut créer mon wxDataObject personnalisé. Comme il est dit dans la doc c'est pas simple mais si vous le fait ça pourra servir à définir un nouveau format qui pourra par exemple être gérer dans les grilles, contrôle de texte, etc. Au final j'ai choisi du texte car c'était suffisant pour retrouver l'objet désigner et surtout plus simple.

La source :

Code wxWidgets:

 
void MywxWindow::OnMouseLeftDown( wxGridEvent& event )
{
    wxTextDataObject aDataObject( mywxString ) ;
 
    wxDropSource adragSource( this ) ;
    adragSource.SetData( aDataObject ) ;
    wxDragResult result = adragSource.DoDragDrop( TRUE ) ;// vous pouvez exploitez le result pour voir comment c'est dérouler le D&D  les différentes valeurs de result sont expliquer dans la doc de wxDropTarget
}
 


La cible:

Code wxWidgets:

#include "wx/dnd.h"
 
class MyTextDropTarget : public wxTextDropTarget
{
    public:
        MyTextDropTarget ( MyStructure* astructure ) ; // la structure qui va être traiter lors  du OnDropText
        virtual~ MyTextDropTarget  () ;
 
    private:
        MyStructure* m_Structure ;
 
        //___Dérivation de wxDropTarget
        virtual bool OnDropText(  wxCoord x, wxCoord y, const wxString& data ) ;
 
};
 
MyStructure::MyStructure( MyStructure* astructure )
: wxTextDropTarget()
{
    m_Item = aItem ;
}
////////////////////////////////////
 
MyStructure::~MyStructure()
{
   // wxLogError( wxT("TEST DAD.") ) ; // pour voir si ça se libère bien
}
////////////////////////////////////
 
//Je vous laisse le code de mon projet ça permettra de voir ce que j'utilise pour traiter la string
bool MyStructure::OnDropText(  wxCoord x, wxCoord y, const wxString& data )
{
 
    //Format du texte reçu
    //ClasseName,wxClef
    wxString aPrefix = wxT(",") ;
 
    wxString aClasseName = data.BeforeLast( aPrefix.GetWritableChar( (size_t)0 )  ) ;
    if( aClasseName != data && !aClasseName.IsEmpty()  )
    {
        wxString aID =data.AfterLast( aPrefix.GetWritableChar( (size_t)0 )  ) ;
        if( aID.IsNumber()  )
        {
            AbstractItemBeans* aBeans = ItemBeansManager::GetInstance()->GetBeans( aClasseName ) ;
 
            unsigned long aClef[1] = { 0 } ;
 
            if( aID.ToULong( aClef )  )
            {
                AbstractItem* aItem = aBeans->GetItem( (int)aClef[0] ) ;
                if( aItem )
                {
                    return m_Structure->AddItemPublic( aItem ) ;
                }
            }
 
        }
 
    }
 
    return false ;
}
 
Explications finales :
Il vous reste plus cas associer votre cible à une wxWindow

Code wxWidgets:

    MyWindow->SetDropTarget( new MyTextDropTarget( aStructure )  ) ;

Vous remarquerez que je m'occupe pas de libérer la target car c'est la window qui s'en occupera.
Si la target aurais été aussi une fenêtre elle aurait provoquée une erreur lors de la libération
sauf si elle n'avait pas de parent. (ps : je vérifirais l'orthographe ce soir , la direction le taff :p )
Commentaires

Il n'y a pas encore de commentaire pour ce snippet.
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Système
» [D&D] Drag and Drop Text