Drag and Drop

Introduction

Drag and Drop Source Example

The full source for this example is available from our GitHub repository: wxWidgetsTutorials/DragAndDrop/DragAndDropText1.

 File: DragAndDrop/DragAndDropText1/src/DragAndDropText1Frame.h
#ifndef _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT1FRAME_H_
#define _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT1FRAME_H_

#include <wx/frame.h>
#include <wx/stattext.h>

class DragAndDropText1Frame : public wxFrame
{
public:
    DragAndDropText1Frame(const wxString& title);

private:
    void OnLeftButtonDown(wxMouseEvent& evt);

private:
    wxStaticText* m_sourceTextCtrl;

    wxDECLARE_EVENT_TABLE();
};

#endif
 File: DragAndDrop/DragAndDropText1/src/DragAndDropText1Frame.cpp
#include "DragAndDropText1Frame.h"
#include <wx/panel.h>
#include <wx/sizer.h>
#include <wx/dataobj.h>
#include <wx/dnd.h>

DragAndDropText1Frame::DragAndDropText1Frame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title), m_sourceTextCtrl(0)
{
    // Create a top-level panel to hold all the contents of the frame
    wxPanel* panel = new wxPanel(this, wxID_ANY);

    // Create a control that will be the source of of the drag and
    // drop operation. We connect an event handler for the
    // left mouse button event.
    m_sourceTextCtrl = new wxStaticText(panel, wxID_ANY, 
        "Hello World!", wxDefaultPosition, wxSize(250,100));
    m_sourceTextCtrl->Connect(wxEVT_LEFT_DOWN, 
        (wxObjectEventFunction)&DragAndDropText1Frame::OnLeftButtonDown, 0, this);

    // Set up the sizer for the panel
    wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
    panelSizer->Add(m_sourceTextCtrl, 0, wxEXPAND | wxALL, 5);
    panel->SetSizer(panelSizer);

    // Set up the sizer for the frame and resize the frame
    // according to its contents
    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->Add(panel, 1, wxEXPAND);
    SetSizerAndFit(topSizer);
}

void DragAndDropText1Frame::OnLeftButtonDown(wxMouseEvent& evt)
{
    wxTextDataObject dragData(m_sourceTextCtrl->GetLabelText());
    wxDropSource dragSource(m_sourceTextCtrl);
    dragSource.SetData(dragData);
    wxDragResult result = dragSource.DoDragDrop();
}

wxBEGIN_EVENT_TABLE(DragAndDropText1Frame, wxFrame)
    EVT_LEFT_DOWN(DragAndDropText1Frame::OnLeftButtonDown)
wxEND_EVENT_TABLE()
 File: DragAndDrop/DragAndDropText1/src/DragAndDropText1App.h
#ifndef _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT1APP_H_
#define _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT1APP_H_

#include <wx/app.h>

class DragAndDropText1App : public wxApp
{
public:
    virtual bool OnInit();
};

#endif
 File: DragAndDrop/DragAndDropText1/src/DragAndDropText1App.cpp
#include "DragAndDropText1App.h"
#include "DragAndDropText1Frame.h"

wxIMPLEMENT_APP(DragAndDropText1App);

bool DragAndDropText1App::OnInit()
{
    DragAndDropText1Frame* frame = new DragAndDropText1Frame("DragAndDropText1");
    frame->Show(true);
    return true;
}

Drag and Drop Target Example

The full source for this example is available from our GitHub repository: wxWidgetsTutorials/DragAndDrop/DragAndDropText2.

 File: DragAndDrop/DragAndDropText2/src/DragAndDropText2Frame.h
#ifndef _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT2FRAME_H_
#define _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT2FRAME_H_

#include <wx/frame.h>
#include <wx/stattext.h>
#include <wx/textctrl.h>
#include <wx/dnd.h>

class DragAndDropText2Frame : public wxFrame
{
public:
    DragAndDropText2Frame(const wxString& title);

private:
    void OnLeftButtonDown(wxMouseEvent& evt);

private:
    wxStaticText* m_sourceTextCtrl;

    wxDECLARE_EVENT_TABLE();

private:
    class DropTarget : public wxTextDropTarget
    {
    public:
        DropTarget(wxTextCtrl& dropTarget);

        virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& data);

    private:
        wxTextCtrl& m_dropTarget;
    };
};

#endif
 File: DragAndDrop/DragAndDropText2/src/DragAndDropText2Frame.cpp
#include "DragAndDropText2Frame.h"
#include <wx/panel.h>
#include <wx/sizer.h>
#include <wx/dataobj.h>

DragAndDropText2Frame::DragAndDropText2Frame(const wxString& title)
    : wxFrame(NULL, wxID_ANY, title), m_sourceTextCtrl(0)
{
    // Create a top-level panel to hold all the contents of the frame
    wxPanel* panel = new wxPanel(this, wxID_ANY);

    // Create a control that will be the source of of the drag and
    // drop operation. We connect an event handler for the
    // left mouse button event.
    m_sourceTextCtrl = new wxStaticText(panel, wxID_ANY, 
        "Hello World!", wxDefaultPosition, wxSize(250,100));
    m_sourceTextCtrl->Connect(wxEVT_LEFT_DOWN, 
        (wxObjectEventFunction)&DragAndDropText2Frame::OnLeftButtonDown, 0, this);

    // Create a text control that can be the target of a drag an drop operation
    wxTextCtrl* targetTextCtrl = new wxTextCtrl(panel, wxID_ANY, 
        "", wxDefaultPosition, wxSize(250, 100));
    DropTarget* dropTarget = new DropTarget(*targetTextCtrl);
    targetTextCtrl->SetDropTarget(dropTarget);

    // Set up the sizer for the panel
    wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
    panelSizer->Add(m_sourceTextCtrl, 0, wxEXPAND | wxALL, 5);
    panelSizer->Add(targetTextCtrl, 0, wxEXPAND | wxALL, 5);
    panel->SetSizer(panelSizer);

    // Set up the sizer for the frame and resize the frame
    // according to its contents
    wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
    topSizer->Add(panel, 1, wxEXPAND);
    SetSizerAndFit(topSizer);
}

void DragAndDropText2Frame::OnLeftButtonDown(wxMouseEvent& evt)
{
    wxTextDataObject dragData(m_sourceTextCtrl->GetLabelText());
    wxDropSource dragSource(m_sourceTextCtrl);
    dragSource.SetData(dragData);
    wxDragResult result = dragSource.DoDragDrop();
}

wxBEGIN_EVENT_TABLE(DragAndDropText2Frame, wxFrame)
    EVT_LEFT_DOWN(DragAndDropText2Frame::OnLeftButtonDown)
wxEND_EVENT_TABLE()

DragAndDropText2Frame::DropTarget::DropTarget(wxTextCtrl& dropTarget)
    : m_dropTarget(dropTarget)
{
}

bool DragAndDropText2Frame::DropTarget::OnDropText(wxCoord x, wxCoord y, const wxString& data)
{
    m_dropTarget.SetValue(data);
    return true;
}
 File: DragAndDrop/DragAndDropText2/src/DragAndDropText2App.h
#ifndef _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT2APP_H_
#define _TUTORIALS_WXWIDGETS_DRAGANDDROPTEXT2APP_H_

#include <wx/app.h>

class DragAndDropText2App : public wxApp
{
public:
    virtual bool OnInit();
};

#endif
 File: DragAndDrop/DragAndDropText2/src/DragAndDropText2App.cpp
#include "DragAndDropText2App.h"
#include "DragAndDropText2Frame.h"

wxIMPLEMENT_APP(DragAndDropText2App);

bool DragAndDropText2App::OnInit()
{
    DragAndDropText2Frame* frame = new DragAndDropText2Frame("DragAndDropText2");
    frame->Show(true);
    return true;
}