|
|
| Строка 1: |
Строка 1: |
| - | Wikipedia:
| |
| - | In computer graphical user interfaces, drag-and-drop is the action of (or support for the action of) clicking on a virtual object and dragging it to a different location or onto another virtual object. In general, it can be used to invoke many kinds of actions, or create various types of associations between two abstract objects.
| |
| | | | |
| - | Drag and drop functionality is one of the most visible aspects of the graphical user interface.
| |
| - | Drag and drop operation enables you to do complex things intuitively.
| |
| - |
| |
| - | In drag and drop we basically drag some data from a data source to a data target.
| |
| - | So we must have:
| |
| - | * Data object
| |
| - | * Data source
| |
| - | * Data target
| |
| - |
| |
| - | For drag & drop of text, wxWidgets has a predefined <b>wxTextDropTarget</b> class.
| |
| - |
| |
| - | In the following example, we drag and drop file names from the upper list control to the bottom one.
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | #include <wx/wx.h>
| |
| - | #include <wx/dnd.h>
| |
| - |
| |
| - | class TextDrop : public wxFrame
| |
| - | {
| |
| - | public:
| |
| - | TextDrop(const wxString& title);
| |
| - |
| |
| - | void OnSelect(wxCommandEvent& event);
| |
| - | void OnDragInit(wxListEvent& event);
| |
| - |
| |
| - | wxGenericDirCtrl *m_gdir;
| |
| - | wxListCtrl *m_lc1;
| |
| - | wxListCtrl *m_lc2;
| |
| - |
| |
| - | };
| |
| - |
| |
| - |
| |
| - | class MyTextDropTarget : public wxTextDropTarget
| |
| - | {
| |
| - | public:
| |
| - | MyTextDropTarget(wxListCtrl *owner);
| |
| - |
| |
| - | virtual bool OnDropText(wxCoord x, wxCoord y,
| |
| - | const wxString& data);
| |
| - |
| |
| - | wxListCtrl *m_owner;
| |
| - |
| |
| - | };
| |
| - |
| |
| - |
| |
| - | </source>
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | #include "textdrop.h"
| |
| - | #include <wx/treectrl.h>
| |
| - | #include <wx/dirctrl.h>
| |
| - | #include <wx/dir.h>
| |
| - | #include <wx/splitter.h>
| |
| - |
| |
| - |
| |
| - | TextDrop::TextDrop(const wxString& title)
| |
| - | : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200))
| |
| - | {
| |
| - |
| |
| - | wxSplitterWindow *spl1 = new wxSplitterWindow(this, -1);
| |
| - | wxSplitterWindow *spl2 = new wxSplitterWindow(spl1, -1);
| |
| - | m_gdir = new wxGenericDirCtrl(spl1, -1, wxT("/home/"),
| |
| - | wxPoint(-1, -1), wxSize(-1, -1), wxDIRCTRL_DIR_ONLY);
| |
| - |
| |
| - | m_lc1 = new wxListCtrl(spl2, -1, wxPoint(-1, -1),
| |
| - | wxSize(-1, -1), wxLC_LIST);
| |
| - | m_lc2 = new wxListCtrl(spl2, -1, wxPoint(-1, -1),
| |
| - | wxSize(-1, -1), wxLC_LIST);
| |
| - |
| |
| - | MyTextDropTarget *mdt = new MyTextDropTarget(m_lc2);
| |
| - | m_lc2->SetDropTarget(mdt);
| |
| - |
| |
| - | Connect(m_lc1->GetId(), wxEVT_COMMAND_LIST_BEGIN_DRAG,
| |
| - | wxListEventHandler(TextDrop::OnDragInit));
| |
| - |
| |
| - | wxTreeCtrl *tree = m_gdir->GetTreeCtrl();
| |
| - |
| |
| - | spl2->SplitHorizontally(m_lc1, m_lc2);
| |
| - | spl1->SplitVertically(m_gdir, spl2);
| |
| - |
| |
| - | Connect(tree->GetId(), wxEVT_COMMAND_TREE_SEL_CHANGED,
| |
| - | wxCommandEventHandler(TextDrop::OnSelect));
| |
| - |
| |
| - | Center();
| |
| - | }
| |
| - |
| |
| - | MyTextDropTarget::MyTextDropTarget(wxListCtrl *owner)
| |
| - | {
| |
| - | m_owner = owner;
| |
| - | }
| |
| - |
| |
| - | bool MyTextDropTarget::OnDropText(wxCoord x, wxCoord y,
| |
| - | const wxString& data)
| |
| - | {
| |
| - |
| |
| - | m_owner->InsertItem(0, data);
| |
| - | return true;
| |
| - |
| |
| - | }
| |
| - |
| |
| - | void TextDrop::OnSelect(wxCommandEvent& event)
| |
| - | {
| |
| - | wxString filename;
| |
| - | wxString path = m_gdir->GetPath();
| |
| - | wxDir dir(path);
| |
| - |
| |
| - | bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES);
| |
| - |
| |
| - | int i = 0;
| |
| - |
| |
| - | m_lc1->ClearAll();
| |
| - | m_lc2->ClearAll();
| |
| - |
| |
| - | while ( cont )
| |
| - | {
| |
| - | m_lc1->InsertItem(i, filename);
| |
| - | cont = dir.GetNext(&filename);
| |
| - | i++;
| |
| - | }
| |
| - | }
| |
| - |
| |
| - |
| |
| - | void TextDrop::OnDragInit(wxListEvent& event)
| |
| - | {
| |
| - |
| |
| - | wxString text = m_lc1->GetItemText(event.GetIndex());
| |
| - |
| |
| - | wxTextDataObject tdo(text);
| |
| - | wxDropSource tds(tdo, m_lc1);
| |
| - | tds.DoDragDrop(wxDrag_CopyOnly);
| |
| - |
| |
| - | }
| |
| - |
| |
| - | </source>
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | #include <wx/wx.h>
| |
| - |
| |
| - | class MyApp : public wxApp
| |
| - | {
| |
| - | public:
| |
| - | virtual bool OnInit();
| |
| - | };
| |
| - |
| |
| - | </source>
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | #include "main.h"
| |
| - | #include "textdrop.h"
| |
| - |
| |
| - | IMPLEMENT_APP(MyApp)
| |
| - |
| |
| - | bool MyApp::OnInit()
| |
| - | {
| |
| - |
| |
| - | TextDrop *td = new TextDrop(wxT("TextDrop"));
| |
| - | td->Show(true);
| |
| - |
| |
| - | return true;
| |
| - | }
| |
| - |
| |
| - | </source>
| |
| - |
| |
| - | In our example, we have a window separated into three parts. This is done by the <i>wxSplitterWindow</i> widget.
| |
| - | In the left part of the window, we have a generic directory control. We display all directories available under our filesystem. In the right part there are two windows. The first displays all files under a selected directory.
| |
| - | The second one is used for dragging the files.
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | MyTextDropTarget *mdt = new MyTextDropTarget(m_lc2);
| |
| - | m_lc2->SetDropTarget(mdt);
| |
| - | </source>
| |
| - |
| |
| - | Here we define a text drop target.
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | wxString text = m_lc1->GetItemText(event.GetIndex());
| |
| - |
| |
| - | wxTextDataObject tdo(text);
| |
| - | wxDropSource tds(tdo, m_lc1);
| |
| - | tds.DoDragDrop(wxDrag_CopyOnly);
| |
| - | </source>
| |
| - |
| |
| - | In the <i>OnDragInit()</i> method, we define a text data object and a drop source object. We call the <i>DoDragDrop()</i> method. The <i>wxDrag_CopyOnly</i> constant allows only copying of data.
| |
| - |
| |
| - | <source lang="cpp">
| |
| - | bool MyTextDropTarget::OnDropText(wxCoord x, wxCoord y,
| |
| - | const wxString& data)
| |
| - | {
| |
| - | m_owner->InsertItem(0, data);
| |
| - | return true;
| |
| - | }
| |
| - |
| |
| - | </source>
| |
| - |
| |
| - | During the dropping operation, we insert the text data into the list control.
| |
| - |
| |
| - | [[image: wxwidgets_faq_textdrop.jpg | center]]
| |
| - |
| |
| - | [[Категория:WxWidgets]]
| |