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 : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» wxGrid : Permettre le Drag'n'Drop d'une cellule
Détails du snippet : wxGrid : Permettre le Drag'n'Drop d'une cellule
Informations sur l'auteur de ce snippet :


Hors ligne
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Introduction / Description :
Bonjour à tous.
Le contrôle wxGrid possède quelques fonctions non documentées, notament celle permettant d'activer le Drag'n'Drop d'une cellule.
Il s'agit de wxGrid::EnableDragCell().
Voici une méthode basique pour l'utiliser.
Contenu du snippet :
Tout d'abord, pour qu'un contrôle ou une fenêtre puisse être l a destination du Drag'n'Drop avec wxWidgets, il faut utiliser une classe dérivée de wxDropTarget.
Pour notre exemple, nous allons faire simple : nous allons faire simple : le Drag'n'Drop permettra de copier/déplacer uniquement le texte contenu dans une cellule, sans se soucier d'un éventuel format. Nous allons donc dériver une classe existante pour le Drag'n'Drop de texte : wxTextDropTarget.
Nous appellerons cette classe wxDndCell.

Code wxWidgets:

//Fichier wxdndcell.h
#ifndef WXDNDCELL_H_INCLUDED
#define WXDNDCELL_H_INCLUDED
 
#include <wx/dnd.h>
#include <wx/grid.h>
 
class wxDndCell : public wxTextDropTarget
{
public:
    wxDndCell(wxGrid *owner);
    virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text);
private:
    wxGrid *m_Owner;
};
#endif // WXDNDCELL_H_INCLUDED


Code wxWidgets:

//Fichier wxdndcell.cpp
#include "wxDndCell.h"
 
wxDndCell::wxDndCell(wxGrid *owner)
{
    m_Owner=owner;
}
 
bool wxDndCell::OnDropText(wxCoord x, wxCoord y, const wxString& text)
{
    if (m_Owner==NULL) return false;
    int iCol=m_Owner->XToCol(x);
    int iRow=m_Owner->YToRow(y);
    if ((iRow==wxNOT_FOUND)||(iCol==wxNOT_FOUND)) return false;
    m_Owner->SetCellValue(iRow-1,iCol-1,text);
    return true;
}
 


Maintenant, pour que la wxGrid accepte d'être la destination du Drag'n'Drop, il faut affecter une instance de cette classe à la wxGrid concernée :

Code wxWidgets:

wxGridTestFrame::wxGridTestFrame(wxFrame *frame, const wxString& title)
    : wxFrame(frame, -1, title)
{
    // On crée le contrôle wxGrid
    m_grid=new wxGrid(this,-1);
    // On crée une grille de 25 lignes x 5 colonnes
    m_grid->CreateGrid(20,5);
    // On mets du texte dans une cellule, pour tester
    m_grid->SetCellValue(1,1,_T("Hello"));
    // La fameuse méthode non-documentée
    m_grid->EnableDragCell();
    // On affecte une instance de notre wxDndCell à la grille
    m_grid->SetDropTarget(new wxDndCell(m_grid));
}

Avec le code ci-dessus, notre grille accepte déjà le Drag'n'Drop de texte depuis une autre application : cool, non ?
Maintenant, il nous reste à gérer le Drag'n'Drop à l'intérieur même de la grille. Pour cela, il faut intercepter l'événement EVT_GRID_CELL_BEGIN_DRAG.

Code wxWidgets:

BEGIN_EVENT_TABLE(wxGridTestFrame, wxFrame)
    EVT_GRID_CELL_BEGIN_DRAG(wxGridTestFrame::OnCellBeginDrag)
END_EVENT_TABLE()
 
void wxGridTestFrame::OnCellBeginDrag(wxGridEvent& event)
{
    // On récupère le texte de l a cellule à copier/déplacer
    wxString sValue=m_grid->GetCellValue(event.GetRow(),event.GetCol());
    // Si vide, pas de Drag'n'Drop
    if (sValue.IsEmpty()) return;
    // On place le texte dans le presse-papier
    wxTextDataObject txtData(sValue);
    wxDropSource src(txtData,m_grid);
    // On active le Drag'n'Drop
    wxDragResult res=src.DoDragDrop(wxDrag_DefaultMove|wxDrag_AllowMove);
    // Si le déplacer était demandé, alors on vide la cellule source
    if (res==wxDragMove) m_grid->SetCellValue(event.GetRow(),event.GetCol(),_T(""));
}

Avec ce code, il est du coup possible de copier/déplacer le contenu d'une cellule vers une autre application (bloc notes, par exemple).
Explications finales :
Et voilà, c'est tout.
Et le pire, c'est que ça marche...
Faites l'essai vous-même...
Commentaires

Il n'y a pas encore de commentaire pour ce snippet.
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» wxGrid : Permettre le Drag'n'Drop d'une cellule