15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Перенос текста между окнами редактирования

Представленный класс позволяет копировать/переносить строки между окнами редактирования или другими редакторами методом 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