赞
踩
当界面中有两个或两个以上CListBox时,需要实现控件在一定控件范围内相互拖动,列表内容在拖动后动态增删,并且在拖动过程中,鼠标显示拖动样式。
以下实例是在两个CListBox控件之间进行拖动:
1、首先生成cur指针文件
可用在线图片处理工具,或者ps讲png格式图片转换成cur文件格式
文件转换要求:loadcursor 对文件要求 3232 24位深度以下 底色需要处理透明
2、对话框重载一下虚函数,定义两个标记变量,详细实现见参考代码
virtual BOOL PreTranslateMessage(MSG pMsg);
bool m_bLeftFg; // 左侧移动标记
bool m_bRightFg; // 右侧移动标记
BOOL CDlgSetTunnelBranch::PreTranslateMessage(MSG *pMsg)
{
BOOL bFlag=CAcUiDialog::PreTranslateMessage(pMsg);
CRect cRectPre,cRectNow,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
}
// 若鼠标释放,且右侧标记为true ,则进行移动操作,然后将右侧标记置位false
if(pMsg->message == WM_LBUTTONUP && m_bRightFg)
{
OnBnClickedButtonTunnelbranchForLeft();
m_bRightFg = 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
}
// 若鼠标释放,且左侧标记为true ,则进行移动操作,然后将左侧标记置位false
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();
}
// 若鼠标移动,且左侧或右侧标记为true,则修改鼠标样式为拖动样式
if (pMsg->message == WM_MOUSEMOVE && (m_bLeftFg || m_bRightFg))
{
::SetCapture(GetSafeHwnd());
::SetCursor(::LoadCursor(AfxGetResourceHandle(), MAKEINTRESOURCE(IDC_POINTER_DRAG))); // 此处为cur文件的ID
}
return bFlag;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。