MFC中Listbox控件实现鼠标自由拖拽式选中与复制
时间: 2024-01-18 21:04:51 浏览: 125
MFC 鼠标拖拽实现
4星 · 用户满意度95%
1. 在MFC的资源编辑器中,添加一个Listbox控件并设置其属性,如:ID为ID_LISTBOX、样式为LBS_EXTENDEDSEL|LBS_HASSTRINGS|LBS_NOTIFY。
2. 在Dlg.h文件中添加头文件#include "afxwin.h",以便使用Listbox控件的相关函数。
3. 在Dlg.h文件中添加成员变量CListBox m_ListBox,以便操作Listbox控件。
4. 在OnInitDialog()函数中添加以下代码,初始化Listbox控件:
m_ListBox.SubclassDlgItem(ID_LISTBOX, this);
m_ListBox.ModifyStyleEx(0, LBS_MULTIPLESEL);
5. 在Listbox控件的WM_LBUTTONDOWN消息处理函数中添加以下代码,实现鼠标自由拖拽式选中:
int nItem = m_ListBox.ItemFromPoint(point);
if (nItem != LB_ERR)
{
UINT uFlags = 0;
m_ListBox.SetSel(nItem, TRUE);
m_ListBox.SetAnchorIndex(nItem);
m_ListBox.SetFocus();
}
6. 在Listbox控件的WM_MOUSEMOVE消息处理函数中添加以下代码,实现鼠标自由拖拽式选中:
if (wParam & MK_LBUTTON)
{
CPoint ptCur = point;
m_ListBox.ClientToScreen(&ptCur);
m_ListBox.ScreenToClient(&ptCur);
int nItem = m_ListBox.ItemFromPoint(ptCur);
if (nItem != LB_ERR)
{
m_ListBox.SetSel(m_ListBox.GetAnchorIndex(), FALSE);
m_ListBox.SetSel(nItem, TRUE);
}
}
7. 在Listbox控件的WM_LBUTTONUP消息处理函数中添加以下代码,实现鼠标自由拖拽式复制:
if (wParam & MK_CONTROL)
{
int nCount = m_ListBox.GetSelCount();
if (nCount > 1)
{
int* pIndex = new int[nCount];
m_ListBox.GetSelItems(nCount, pIndex);
CString strCopy;
for (int i = 0; i < nCount; i++)
{
CString strItem;
m_ListBox.GetText(pIndex[i], strItem);
strCopy += strItem + "\r\n";
}
if (OpenClipboard())
{
EmptyClipboard();
HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, (strCopy.GetLength() + 1) * sizeof(TCHAR));
if (hData != NULL)
{
TCHAR* pCopy = (TCHAR*)GlobalLock(hData);
lstrcpy(pCopy, strCopy);
GlobalUnlock(hData);
SetClipboardData(CF_UNICODETEXT, hData);
}
CloseClipboard();
}
delete[] pIndex;
}
}
这样,当用户在Listbox控件中拖拽鼠标时,选中的项会随着鼠标的移动而改变;当用户在Listbox控件中按下Ctrl键并选择多个项后,可以使用Ctrl+C复制所选项,并将其复制到剪贴板中。
阅读全文