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

news/2024/12/21 22:07:32/

上一篇文章推荐了一个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开发桌面应用程序会显得比较繁琐甚至不能满足需求,因此如果比较追求界面体验,还是应该多多使用其他更新一点的集成库(框架),以提高开发效率。


http://www.ppmy.cn/news/292891.html

相关文章

mp3剪辑器

mp3剪辑器可以根据个人的喜好对软件任意一段进行截取&#xff0c;也可以对歌曲进行拼接&#xff0c;实现歌曲的无缝拼接&#xff0c;在制作的时候还能够加入淡入淡出&#xff0c;混响效果等歌曲特效。不少喜欢车载音乐的用户都有想要下载一个此类型的软件&#xff0c;可是网络上…

android剪切合并MP3音乐,android剪切合并MP3音乐

以前做过一个音乐播放器&#xff0c;基本的功能都有&#xff0c;什么在线播放&#xff0c;下载&#xff0c;歌词显示&#xff0c;分享等。下面是剪切合并代码&#xff0c;算法也有&#xff0c;结合算法才好看代码 package com.cdu.hhmusic.utils; import java.io.File; import …

mp3cutter java_开源一款超级好用的mp3剪切器app

功能上虽然简洁&#xff0c;但是技术上该项目“麻雀虽小&#xff0c;五脏俱全”。 下面从技术层面上做一些简单介绍&#xff1a; 首页使用了CoordinatorLayoutAppBarLayoutDrawerLayoutNavigationView的经典MD设计风格。 项目整体采用了MVPdatabindingrxjava2rxandroid2dagger2…

喜报!恭喜知了堂学员成功通过CISP-PTE证书考试

有人说&#xff0c;大学可以不谈恋爱&#xff0c;但一定要考证。 考证&#xff0c;是大学校园生活的关键一环。充分利用在校时间为后期就业提前储备优势&#xff0c;毕业后如果从事IT领域&#xff0c;证书就是一个高含金量的专业认证&#xff0c;尤其是网络安全行业&#xff0…

MCP1501基准电源系列输出电容为什么不能超过300P

1 介绍 在我们通常理解中基准的输出电容需要在100nF以上&#xff0c;才能有较好的性能输出&#xff0c;为什么MCP1501系列官方推荐输出负载电容不能超过300P呢 2 原理分析 如下是MCP1501手册中标注的&#xff0c;最大负载电容不能超过300pF&#xff0c;超过300pF容易振荡 MC…

6.9 条件变量的使用及注意事项

目录 条件变量 使用步骤&#xff1a; 初始化&#xff1a; 生产资源线程&#xff1a; 开始产生资源 消费者线程&#xff1a; 条件变量 应用场景&#xff1a;生产者消费者问题&#xff0c;是线程同步的一种手段。 必要性&#xff1a;为了实现等待某个资源&#xff0c;让线…

Vue.js 中的 v-for 中的 key 属性

Vue.js 中的 v-for 中的 key 属性 Vue.js 是一个流行的 JavaScript 前端框架&#xff0c;它提供了一种简单的方式来构建可复用的组件和应用程序。在 Vue.js 中&#xff0c;v-for 指令用于循环渲染一个数组或对象&#xff0c;并将每个元素渲染为一个 DOM 元素。在使用 v-for 指…

【无标题】2024年、2025年毕业五年制专转本辅导班招生简章

2024年、2025年毕业五年制专转本辅导班招生简章 要不要上课外班&#xff1f;选择什么样的课外班&#xff1f;如何选择一个合适的课外班&#xff1f;一个最为基本的思考立足点是课外班应该满足你孩子的需求。 这里面有两个意思&#xff0c;一个是不要因为别人孩子上课外班&…