问题说明:我正在制作仿酷狗播放器,做到音乐播放的部分时用到CSliderUI控件,后台的音频类回去控制CSliderUI的行为  CSliderUI的行为与酷狗的非常不一样,有几样缺陷:
  问题1:仅仅能通过点击CSliderUI的某个位置才干触发valuechanged消息,无法通过滑动滑块去触发,这个bug严重
  问题2:点击CSliderUI的某个位置,当鼠标弹起时滑块才改变位置,而其它软件都是鼠标按下时改变了
  问题3:后台有代码一直调用SetValue函数改变滑块的位置时,会和鼠标土洞滑块冲突,表如今滑块会一直来回跳动
  问题4:滑块滑动过程中无法通知主窗口正在改变,这点用在音量改变时,通常我们是一边滑动一边改变了音量,而不是滑动完毕后再改, 为
  此我们加入一个新的消息DUI_MSGTYPE_VALUECHANGED_MOVE,把这个消息的定义放到UIDefine.h文件里
  #define DUI_MSGTYPE_VALUECHANGED_MOVE      (_T("movevaluechanged"))
  同一时候出于效率考虑,要让CSliderUI发出这个消息,应该设置属性sendmove为真,默觉得假
  我改动的代码能够通过搜索字符串“2014.7.28 redrain”,来查找,方便大家查看源代码
  此次改动不会影响控件原有的属性,我个人水平有限,假设有不论什么问题,能够联系我
  //=====================================================================================================
  问题的描写叙述结束了,当中的大部分问题都是因为在DoEvent函数中对一些逻辑的推断的不足导致的。
  问题1的解决:仅仅能通过点击CSliderUI的某个位置才干触发valuechanged消息,无法通过滑动滑块去触发这是因为原来的UIEVENT_BUTTONUP
  消息处理不当造成的,原代码为:
if( event.Type == UIEVENT_BUTTONUP )
{
int nValue;
if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {
m_uButtonState &= ~UISTATE_CAPTURED;
}
if( m_bHorizontal ) {
if( event.ptMouse.x >= m_rcItem.right - m_szThumb.cx / 2 ) nValue = m_nMax;
else if( event.ptMouse.x <= m_rcItem.left + m_szThumb.cx / 2 ) nValue = m_nMin;
else nValue = m_nMin + (m_nMax - m_nMin) * (event.ptMouse.x - m_rcItem.left - m_szThumb.cx / 2 ) / (m_rcItem.right - m_rcItem.left - m_szThumb.cx);
}
else {
if( event.ptMouse.y >= m_rcItem.bottom - m_szThumb.cy / 2 ) nValue = m_nMin;
else if( event.ptMouse.y <= m_rcItem.top + m_szThumb.cy / 2  ) nValue = m_nMax;
else nValue = m_nMin + (m_nMax - m_nMin) * (m_rcItem.bottom - event.ptMouse.y - m_szThumb.cy / 2 ) / (m_rcItem.bottom - m_rcItem.top - m_szThumb.cy);
}
if(m_nValue !=nValue && nValue>=m_nMin && nValue<=m_nMax)
{
m_nValue =nValue;
m_pManager->SendNotify(this, DUI_MSGTYPE_VALUECHANGED);
Invalidate();
}
return;
}
  在后的推断出能够看到,仅仅有当m_nValue !=nValue时才会发送DUI_MSGTYPE_VALUECHANGED消息,而我们滑动滑块时,通过上面的代码不难分析出,这两个值一直是相等的,所以导致他没有发出消息,所以我们把这个推断凝视掉即可了