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

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

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

       后来,就对代码进行屏蔽,看哪段代码屏蔽了不会造成这个问题。最后,定位在了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事件,在回音壁的选项卡的文本很多,都是在回音壁选项卡切换出问题的,但是为什么会是这个问题呢?知道的人可以回复下。

 

相关文章:

  • 2021-08-13
  • 2022-12-23
  • 2022-12-23
  • 2021-12-12
  • 2021-06-06
  • 2022-12-23
  • 2021-12-16
  • 2021-09-19
猜你喜欢
  • 2021-08-14
  • 2022-12-23
  • 2021-07-16
  • 2022-12-23
  • 2022-12-23
  • 2021-10-21
  • 2022-01-07
相关资源
相似解决方案