这是在公司做的一个项目, 实现可视化调节参数内容包括频段、频点、增益和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事件,在回音壁的选项卡的文本很多,都是在回音壁选项卡切换出问题的,但是为什么会是这个问题呢?知道的人可以回复下。