MFC 菜单栏一片黑,界面卡顿问题

本文描述了一款声音美化软件在快速调节参数时遇到的界面卡顿问题,详细介绍了通过调整文本更新频率和优化文本框控件代码解决这一难题的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这是在公司做的一个项目, 实现可视化调节参数内容包括频段、频点、增益和Q值等,可以美化(包括丑化)和修饰声音,使声音(或音乐)风格更加鲜明突出。软件如下图所示:

       但这软件开发过程中一直存在一个问题,显图速度调快的情况下,频繁拖动点会导致界面卡顿和菜单栏一片黑,而后界面就崩溃无法动作,但设断点调试时该断点的地方都会进入。刚开始怀疑是进程堵塞,就对画图和算法都加了线程,都没解决问题。

       后来,就对代码进行屏蔽,看哪段代码屏蔽了不会造成这个问题。最后,定位在了SetWindowText(str), 这函数主要是设置文本框数字的,因为拖动过程中会不断地设置文本框数字,所以就不断触发着这个 SetWindowText(str)函数。我怎么都想不通为什么这个函数频繁执行会出问题的,但是,问题就出在这里,我只能从这里下手解决(worry....)。

       现在的软件是鼠标拖动点触发ON_WM_MOUSEMOVE事件就设置文本,所以导致文本设置函数频繁执行,所以我想到的解决方案是设置一个阈值,触发ON_WM_MOUSEMOVE事件到一定次数才设置文本数字,再加上ON_WM_LBUTTONDOWN放下鼠标按键触发设置文本数字,使图像点的位置最终和设置的文本框数字一致,解决了这个问题。但在界面测试时发现了两个问题:

      1. 鼠标悬停时出现图像上点的位置值和文本上的值对应不上;

      2. 鼠标突然拖动离开图表区时,图像上点的位置值和文本上的值对应不上。

      这两个问题可以通过触发WM_MOUSELEAVE(鼠标离开),WM_MOUSEHOVER(鼠标悬停)事件来设置文本值,这样就能保证图像上的点的位置值和文本值对应上。

      当然,要触发上面两个消息需要在ON_WM_MOUSEMOVE事件里添加额外的代码:

      TRACKMOUSEEVENT tme;
      tme.cbSize = sizeof(tme);
      tme.hwndTrack = m_hWnd;
      tme.dwFlags = TME_LEAVE|TME_HOVER;      // 鼠标离开和悬停事件
      tme.dwHoverTime = 30;                                     //  悬停触发时间,设置小了也会导致悬停触发频繁设置文本
      m_bIsTracking = _TrackMouseEvent(&tme);

      以上就完美解决了这个界面问题,就以为一切都顺利完成的时候,测试部就出来一个问题,频繁点击选项卡时也会导致这个一模一样的问题。断点调试时,发现点击选项卡更换界面并不会触发到这个SetWindowText函数。还是老办法,屏蔽代码找问题,先关闭了图像显示,没问题。所以,问题还是指向了文本框控件。

     仔细检查了文本框控件代码,这个文本框使被我重载过的,有重载了ON_WM_CTLCOLOR_REFLECT()事件,屏蔽了这个事件后就没有这个问题了。这个事件在界面刷新或者文本框变动的情况下都会触发,主要是设置文本字体和背景颜色。

     问题代码是在事件   return CreateSolidBrush(WORK_COLOR);        //设置背景色

     而 return NULL;            // 就没问题了

     返回NULL后,恢复成原来不断在ON_WM_MOUSEMOVE事件里不断设置文本的情况都没问题了。因为在设置文本的过程中,就会触发ON_WM_MOUSEMOVE事件,所以根本问题还是在这个ON_WM_MOUSEMOVE事件,在回音壁的选项卡的文本很多,都是在回音壁选项卡切换出问题的,但是为什么会是这个问题呢?知道的人可以回复下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祎猿

点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值