鼠标对MFC对话框上的Listbox文本数据进行自由拖拽式复制的详细步骤与详细代码
时间: 2024-05-09 18:21:16 浏览: 205
步骤:
1. 在MFC对话框上添加一个Listbox控件,并设置其属性为可拖放;
2. 在Listbox控件的OnLButtonDown事件中,获取鼠标点击的位置和选中的文本,将其保存到拖放数据中;
3. 在Listbox控件的OnMouseMove事件中,检测鼠标是否移动足够远,如果是,则开始拖放操作;
4. 在Listbox控件的OnDragEnter、OnDragOver、OnDragLeave、OnDrop事件中,实现拖放操作的处理逻辑,包括获取拖放数据、判断是否可以放置、更新拖放效果、完成拖放操作等。
详细代码:
1. 在对话框类的头文件中添加以下代码:
```
class CMyDlg : public CDialogEx
{
// ...
protected:
COleDataSource m_dataSource;
CString m_strDragText;
CPoint m_ptStartDrag;
BOOL m_bDragging;
// ...
};
```
2. 在OnInitDialog函数中添加以下代码,设置Listbox控件的拖放属性:
```
m_listBox.ModifyStyle(0, LBS_MULTIPLESEL | LBS_EXTENDEDSEL | LBS_HASSTRINGS | LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_DISABLENOSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_GROUP | WS_TABSTOP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | LBS_DISABLENOSCROLL | LBS_NOINTEGRALHEIGHT);
DROPEFFECT de = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;
m_listBox.RegisterDragDrop(&m_dataSource, &de);
```
3. 实现鼠标事件的处理函数:
```
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// 获取选中的文本
int nIndex = m_listBox.ItemFromPoint(point);
if (nIndex != LB_ERR && m_listBox.GetSel(nIndex) > 0) {
m_strDragText = m_listBox.GetText(nIndex);
m_ptStartDrag = point;
m_bDragging = FALSE;
}
CDialogEx::OnLButtonDown(nFlags, point);
}
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_strDragText.IsEmpty() || m_bDragging) {
return;
}
if ((abs(point.x - m_ptStartDrag.x) > GetSystemMetrics(SM_CXDRAG)) || (abs(point.y - m_ptStartDrag.y) > GetSystemMetrics(SM_CYDRAG))) {
m_bDragging = TRUE;
DROPEFFECT de = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;
m_dataSource.CacheGlobalData(CF_TEXT, m_strDragText.GetBuffer(), m_strDragText.GetLength() + 1);
m_dataSource.DoDragDrop(de, NULL, NULL);
m_strDragText.Empty();
}
CDialogEx::OnMouseMove(nFlags, point);
}
```
4. 实现拖放事件的处理函数:
```
DROPEFFECT CMyDlg::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
if (pDataObject->IsDataAvailable(CF_TEXT)) {
return DROPEFFECT_COPY;
}
return DROPEFFECT_NONE;
}
void CMyDlg::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
if (pDataObject->IsDataAvailable(CF_TEXT)) {
m_listBox.SetCurSel(m_listBox.ItemFromPoint(point));
m_listBox.SetFocus();
}
}
void CMyDlg::OnDragLeave()
{
m_listBox.SetCurSel(-1);
}
BOOL CMyDlg::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
if (pDataObject->IsDataAvailable(CF_TEXT)) {
HGLOBAL hData = pDataObject->GetGlobalData(CF_TEXT);
if (hData != NULL) {
LPCTSTR pszText = (LPCTSTR)GlobalLock(hData);
CString strText = pszText;
GlobalUnlock(hData);
int nIndex = m_listBox.ItemFromPoint(point);
if (nIndex != LB_ERR) {
m_listBox.InsertString(nIndex, strText);
}
}
}
return TRUE;
}
```
阅读全文