本文共 1928 字,大约阅读时间需要 6 分钟。
功能描述:在界面中,当存在两个或多个CListBox控件时,需要实现它们之间的拖动功能。拖动时,列表内容会动态增删,并且在拖动过程中,鼠标会显示拖动样式。
实现步骤:首先,需要生成相应的拖动曲标文件(.cur格式)。可以使用在线工具或图片处理软件将图片转换为.cur文件,确保文件大小为32×32像素,颜色深度为24位,底色处理透明。
接下来,重载对话框类的PreTranslateMessage虚函数,定义两个布尔变量来控制拖动状态。具体实现如下:
代码示例:
bool CDlgSetTunnelBranch::PreTranslateMessage(MSG *pMsg){ BOOL bFlag = CAcUiDialog::PreTranslateMessage(pMsg); CRect cRectPre, cRectEnd; // 记录控件位置 CPoint curPoint; // 记录鼠标位置 ::GetCursorPos(&curPoint); GetDlgItem(IDC_LIST_TUNNELBRANCH_LEFT)->GetWindowRect(cRectPre); GetDlgItem(IDC_LIST_TUNNELBRANCH_RIGHT)->GetWindowRect(cRectEnd); // 处理左侧控件 if (curPoint.x >= cRectPre.left && curPoint.x < cRectPre.right && curPoint.y >= cRectPre.top && curPoint.y < cRectPre.bottom) { if (pMsg->message == WM_LBUTTONDOWN) { m_bLeftFg = true; // 设置左侧标记为true } if (pMsg->message == WM_LBUTTONUP && m_bRightFg) { OnBnClickedButtonTunnelbranchForLeft(); m_bRightFg = false; // 将右侧标记置false } } // 处理右侧控件 if (curPoint.x >= cRectEnd.left && curPoint.x < cRectEnd.right && curPoint.y >= cRectEnd.top && curPoint.y < cRectEnd.bottom) { if (pMsg->message == WM_LBUTTONDOWN) { m_bRightFg = true; // 设置右侧标记为true } if (pMsg->message == WM_LBUTTONUP && m_bLeftFg) { OnBnClickedButtonTunnelForRight(); m_bLeftFg = false; // 将左侧标记置false } } // 鼠标抬起时重置标记并还原鼠标样式 if (pMsg->message == WM_LBUTTONUP) { m_bLeftFg = false; m_bRightFg = false; ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); ::ReleaseCapture(); } // 处理拖动时的鼠标样式 if (pMsg->message == WM_MOUSEMOVE && (m_bLeftFg || m_bRightFg)) { ::SetCapture(GetSafeHwnd()); ::SetCursor(::LoadCursor(AfxGetResourceHandle(), MAKEINTRESOURCE(IDC_POINTER_DRAG))); } return bFlag;} 这个代码实现了拖动功能,包括拖动时的鼠标样式变化和列表内容的动态增删。
转载地址:http://qbqn.baihongyu.com/