博客
关于我
CListBox使用:MFC中的多个CListBox之间实现鼠标拖拽移动内容
阅读量:188 次
发布时间:2019-02-28

本文共 2155 字,大约阅读时间需要 7 分钟。

功能描述:

当界面中有两个或两个以上CListBox时,需要实现控件在一定控件范围内相互拖动,列表内容在拖动后动态增删,并且在拖动过程中,鼠标显示拖动样式。

以下实例是在两个CListBox控件之间进行拖动:

实现步骤:

1、首先生成cur指针文件

可用在线图片处理工具,或者ps讲png格式图片转换成cur文件格式
文件转换要求:loadcursor 对文件要求 32*32 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;}

这里写图片描述

你可能感兴趣的文章
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>