上一篇文章推荐了一个MP3剪切器,其中有关播放进度的调整存在问题,滑块本身拖动可以完成进度调整,但当通过鼠标单击目标位置时,滑块总是不能直接跳到想要达到的位置,使用体验较差。本文主要讨论一下如何调整滑块对鼠标消息的响应。

通过查询资料得知,MFC自带的滑块控件(SLIDER)并不支持单击调整位置,每次单击时滑块只能移动某一固定距离。此时如果想实现滑块移到鼠标位置,就需要对滑块的鼠标消息响应过程进行重写(Override,重写是指派生类的方法覆盖基类的方法,要求方法名、方法的参数都相同。这里区别于之前文章讲到的重载)。不过通过实际尝试和查阅资料发现,程序中重写了鼠标左键按下(WM_LBUTTONDOWN)的消息响应函数,但实际使用中点击滑块控件时并不能进入消息响应函数,导致调整进度条失败,但点击控件之外的地方可以正常进入。同样的重写思路在QT中是可以正常实现的,这里目前还没有搞清楚。

既然直接重写消息响应函数无效,只能考虑使用其他方法实现。这里用到一个虚函数:PreTranslateMessage,此函数是消息在响应之前调用。因此如果需要在程序响应某些消息之前做一些处理,可以通过实现此函数进行处理。

基本思路是当鼠标按下时,PreTranslateMessage先接收到鼠标消息,此时进行进度条的调整,代码如下(新建一个测试程序MFCTest):

BOOL CMFCTestDlg::PreTranslateMessage(MSG* pMsg)
{if (pMsg->message == WM_LBUTTONDOWN){CPoint   point;GetCursorPos(&point);ScreenToClient(&point);CRect rect;GetDlgItem(IDC_SLIDER1)->GetWindowRect(&rect);ScreenToClient(&rect);if (point.y > rect.top && point.y < rect.bottom){if (point.x > rect.left && point.x < rect.right){return TRUE;}}}if (pMsg->message == WM_LBUTTONUP){CPoint   point;GetCursorPos(&point);ScreenToClient(&point);CRect rect;GetDlgItem(IDC_SLIDER1)->GetWindowRect(&rect);ScreenToClient(&rect);if (point.y > rect.top && point.y < rect.bottom){if (point.x > rect.left && point.x < rect.right){int pos = 100 * (point.x - (rect.left + 10)) / ((rect.right - 10) - (rect.left + 10));m_MySlider.SetPos(pos);SetDlgItemInt(IDC_EDIT1, pos);}}}return CDialogEx::PreTranslateMessage(pMsg);
}

由以上代码看出,函数执行过程为:
1.此函数截获鼠标按下消息,判定如果鼠标位于滑块控件范围内则直接返回,此举目的是为了防止控件本身响应鼠标按下消息,导致滑块位置抖动。
2.函数截获鼠标松开消息,判定如果鼠标位于滑块控件范围内,则通过鼠标指针的坐标和滑块控件的相对位置进行计算得到滑块实际值(滑块总长度为100)。
3.调整滑块位置。
程序运行效果如下动画:

将此方法添加到上一篇文章的MP3剪切器中,测试运行效果:

新版MP3剪切器下载链接:
https://alwaywon.lanzoux.com/iAIiNoyxduj

https://pan.baidu.com/s/1-LRwlWDIkNBaulw9c55zgw 提取码:hfmn

总结:MFC是一套比较老的开发库了,对Windows API做了比较好的封装,但在如今对界面要求较高的情况下使用MFC开发桌面应用程序会显得比较繁琐甚至不能满足需求,因此如果比较追求界面体验,还是应该多多使用其他更新一点的集成库(框架),以提高开发效率。

MFC滑块对单击消息的响应(MP3剪切器V1.1)相关推荐

  1. MFC 教程【4_消息映射的实现】

    消息映射的实现 Windows消息概述 Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口.这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows. 消息的 ...

  2. MFC中picture控件如何响应鼠标移动?

    MFC中picture控件如何响应鼠标移动? 2011-08-21 21:23 轻若惊鸿 | 浏览 3354 次 硬件网络 我将一个picture控件的属性中的Notify勾上了,但是只能响应鼠标按键 ...

  3. MFC滑块的使用方式

    MFC滑块的使用方式: 如下六个滑块的使用方式: void CPropColor::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) ...

  4. MFC动态创建控件并响应事件代码实现过程

    MFC动态创建控件以及响应动态创建的控件的事件的实现方法如下. 1.创建对象     用new进行动态创建一个对象.然后调用Create函数创建窗口,在函数的父窗口参数中传入this或者用AfxGet ...

  5. MFC中Windows窗口消息循环及多线程之间关系

       Windows中一个进程可以包含多个线程,由多个线程组成.在Windows应用程序中,窗体是由"UI线程(User Interface Thread)"的特殊类型的线程创建的 ...

  6. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  7. 微信接口验证类php,微信公众平台消息接口校验与消息接口响应实例

    本文实例讲述了微信公众平台消息接口校验与消息接口响应的方法.分享给大家供大家参考.具体分析如下: 开发微信公众平台消息接口过程中,我们首先需要验证消息接口的有效性,验证通过后,才可以进行其他开发,首先 ...

  8. 微信公众号消息接口PHP,微信公众平台消息接口校验与消息接口响应实例

    本文实例讲述了微信公众平台消息接口校验与消息接口响应的方法.分享给大家供大家参考.具体分析如下: 开发微信公众平台消息接口过程中,我们首先需要验证消息接口的有效性,验证通过后,才可以进行其他开发,首先 ...

  9. 【数据库】SQLServer数据库、附加数据库时出错。有关详细信息,请单击“消息”列中的超链接

    [数据库]SQLServer数据库.附加数据库时出错.有关详细信息,请单击"消息"列中的超链接 这个问题ex了我好久好久,让我刚开始以为是版本问题,2019运行出现了这个错误,以前 ...

最新文章

  1. 关于写代码的几个看法
  2. pro git读书笔记
  3. 安装setuptools的UnicodeDecodeError
  4. 智能家居市场需求矛盾深层原因分析
  5. IOS学习笔记十六(NSString和NSMutableString)
  6. 大数据数据收集数据困难_大数据就是好数据吗?研究人员在处理大数据集时遭遇的 5 大挑战...
  7. linux挂载ntfs分区报错,Linux下挂载NTFS分区和挂载分区的方法
  8. cloudmusic:网易云爬虫
  9. codeblocks下载安装教程(完整详细)
  10. Vue进阶(六十三):如何使浏览器打开时,默认的文档模式就是标准模式
  11. 【前端知识之JS】JS的作用域链
  12. ubuntu安装与卸载deb文件
  13. 数据结构实验教程-第一套
  14. 韶音骨传导耳机值得入手吗?南卡和韶音骨传导耳机实测对比
  15. 浅谈设计模式在iOS开发实战项目中的应用
  16. 有哪些操作简单能将PDF转成图片的工具?
  17. Android多媒体之SoundPool+pcm流的音频操作
  18. 更新NVIDIA显卡的CUDA驱动出错,You appear to be running an X server; please exit X before
  19. 抖音计算机音乐你要我,抖音我要记住你的样子是什么歌
  20. 重装助手安装系统教程

热门文章

  1. 即兴演讲的“三定”和“四思”、“五借”技巧
  2. 三星折叠屏|保持屏幕状态
  3. 手机有什么副业做?用手机能做啥副业?
  4. OPPO也要自研芯片?欲采用台积电3nm工艺
  5. DNN、CNN、RNN
  6. 生活有多面性,你可以选择快乐也可选择痛苦,主动权在自己的手里
  7. 康传平Excel2018年10月份新个人所得税计算公式的两种方法
  8. 《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——1.10 将MIDI音乐伴奏转换成音频伴奏...
  9. propagation=NEVER”
  10. 扩频通信捕获matlab,扩频通信捕获的matlab仿真