问题2的解决:
  点击CSliderUI的某个位置,当鼠标弹起时滑块才改变位置,而其它软件都是鼠标按下时改变了,这是因为原来的UIEVENT_BUTTONDOWN消息的处理不全面造成的,原代码为:
if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK )
{
if( IsEnabled() ) {
RECT rcThumb = GetThumbRect();
if( ::PtInRect(&rcThumb, event.ptMouse) ) {
m_uButtonState |= UISTATE_CAPTURED;
}
}
return;
}
  能够看到原代码没有做对于控件的外观的不论什么改动,我们把代码改动例如以下:
if( event.Type == UIEVENT_BUTTONDOWN || event.Type == UIEVENT_DBLCLICK )
{
if( IsEnabled() ) {//2014.7.28 redrain 凝视掉原来的代码,加上这些代码后能够让Slider不是在鼠标弹起时才改变滑块的位置
m_uButtonState |= UISTATE_CAPTURED;
int nValue;
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;
Invalidate();
}
}
return;
}
  问题3的解决:
  后台有代码一直调用SetValue函数改变滑块的位置时,会和鼠标土洞滑块冲突,表如今滑块会一直来回跳动,这是由于,当我们拖动滑块时会动态的改动Slider的m_nValue值,而且会刷新控件,而通过读PaintStatusImage函数可知,控件正式通过这个m_nValue变量来决定滑块的绘制位置。而我在后台让音乐播放类去依据音乐的进度调用SetValue函数,这个函数理所当然的改动了m_nValue值,这导致了冲突,这个函数是父类的,所以我们要重写这个函数。当鼠标正在滑动式不让SetValue去改变控件的滑块的位置。
  添加SetValue函数然后重写他,改动的代码为:
  void CSliderUI::SetValue(int nValue)
  {
  if( (m_uButtonState & UISTATE_CAPTURED) != 0 )
  return;
  CProgressUI::SetValue(nValue);
  }