Перенос текста между окнами
редактирования
Представленный класс позволяет
копировать/переносить строки между окнами
редактирования или другими редакторами методом
drag'n'drop. Класс CDragEdit реализует возможность
drag'n'drop через UDT (Uniform Data Transfer) OLE, так что Вы можете
использовать его с большинством приложений.
Объявлено два класса: CDEDropTarget наследованный
от COleDropTarget и CDEDataSource наследованый от
COleDropSource. CDEDropTarget обслуживает CDragEdit как
потребитель данных, CDEDataSource обслуживает
CDragEdit как производитель данных. Drag'n'drop начинает
пересылать данные когда пользователь нажал
левую клавишу мыши и перетаскивает интересующую
его строку, поэтому CDragEdit перехватывает
сообщение WM_LBUTTONDOWN, копируя выделенную строку
в CDEDataSource-объект. Для этого используется
функция CacheGlobalData(). В CDragEdit::Init() это окно
регистрируется как цель приема (drop target),
используя метод CDEDropTarget::Register(). Как только
регистрация завершена CDragEdit становится
пригодным получать OnDropEnter(), OnDropOver(), OnDropLeave()
и OnDrop() от OLE. В методе OnDrop() CDragEdit получит
текст с отметкой CF_TEXT от COleDataObject и
разместит его в нужное место.
Например, Вы хотите использовать drag'n'drop в элменте
управления класса CTesDragEditDlg. Тогда должны
добавить приблизительно такие строки:
////////////////////// //TestDragEditDlg.h ////////////////////// #include
"CDragEdit.h" //include it in your xxxDlg.h
class CTestDragEditDlg : public CDialog
{
...
// Dialog Data
//{{AFX_DATA(CTestDragEditDlg)
enum { IDD = IDD_DRAGEDIT };
CDragEdit m_edit2; //объявляем переменнуюCDragEdit
CDragEdit m_edit1; //для каждого окна редактирования
//}}AFX_DATA
...
}
//////////////////////
//TestDragEditDlg.cpp
//////////////////////
void CTestDragEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDragEditDlg)
DDX_Control(pDX, IDC_EDIT2, m_edit2);
DDX_Control(pDX, IDC_EDIT1, m_edit1);
//}}AFX_DATA_MAP
}
BOOL CTestDragEditDlg::OnInitDialog()
{
...
=== //Вы должны сначала проинициализировать CDragEdit
m_edit1.Init();
=== m_edit2.Init();
...
}
Файл README.TXT содержит более подробную информацию
по использованию класса. Zip-архив
класса и ознакомительного
проекта.
Источник: ProtoSphere
|