相关代码如下:BOOL CLeftBarDlg::OnInitDialog() 
{
CDialog::OnInitDialog();
m_VolumeSlideCtrl.SetRange(0, 100);
m_VolumeSlideCtrl.SetTicFreq(1);
m_VolumeSlideCtrl.SetPos(10);
if (m_pConfDlg && m_pConfDlg->m_pMediaController)
m_pConfDlg->m_pMediaController->SetPlayVolume(10);
return TRUE; 
}
void CLeftBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
// TODO: Add your message handler code here and/or call default

if (m_VolumeSlideCtrl.m_hWnd)
{

if (m_VolumeSlideCtrl.m_hWnd == pScrollBar->m_hWnd)
{  
nPos = m_VolumeSlideCtrl.GetPos();
if (m_pConfDlg && m_pConfDlg->m_pMediaController)
m_pConfDlg->m_pMediaController->SetPlayVolume(nPos);
}

} CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
有两个问题请教各位:
1、为什么滑块拖动过程中音量大小不会改变,释放鼠标后音量才改变?怎么办?
2、我想实现滑块向右移动的过程中,怎样利用图片显示它走过的轨迹?就像一般音乐软件实现的效果
谢谢!!

解决方案 »

  1.   

    SCROLLINFO si={0};
    si.cbSize=SIF_ALL;
    pScrollBar->GetScrollInfo(&si);
    nNewPos=si.nPos;
    switch(nSBCode)
    {
    case SB_THUMBTRACK:
    nNewPos=nPos;
    break;
    case SB_BOTTOM:
    nNewPos+=1;
    break;
    case SB_TOP:
    nNewPos-=1;
    break;
    case SB_LINEUP:
    nNewPos-=1;
    break;
    case SB_LINEDOWN:
    nNewPos+=1;
    break;
    case SB_PAGEDOWN:
    nNewPos+=si.nPage;
    break;
    case SB_PAGEUP:
    nNewPos-=si.nPage;
    break;
    default:
    break;
    }
    if(nNewPos>si.nMax)
    nNewPos=si.nMax;
    if(nNewPos<si.nMin)
    nNewPos=si.nMin;
    pScrollBar->SetScrollPos(nNewPos);
    可以利用消息响应的,上面的代码可以改改
      

  2.   

    1.m_VolumeSlideCtrl如果是CSliderCtrl的话,在VC里面属性设置的时候,设置成EnableSelection试试,看不能能解决你说的问题。否则检查你的代码,在拖动的过程中是否每次都重置了音量。
    2.要想实现这个效果其实用不到这么麻烦,都CodeProject上去找找:
    http://www.codeproject.com/Articles/3241/CSliderCtrlEx-A-slider-with-background-colors-to-i
    http://www.codeproject.com/Articles/8985/Customizing-the-Appearance-of-CSliderCtrl-Using-Cu
    自绘控件一般都这样的。
      

  3.   

    楼上提供的codeproject两个实例好像不是楼主所描述的吧?
      

  4.   

    m_VolumeSlideCtrl是CSliderCtrl,设置EnableSelection还是不行
    第二个问题,我是这样的,利用StretchBlt函数
    void CLeftBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    if (m_VolumeSlideCtrl.m_hWnd)
    {

    if (m_VolumeSlideCtrl.m_hWnd == pScrollBar->m_hWnd)
    {  
    nPos = m_VolumeSlideCtrl.GetPos();
    if (m_pConfDlg && m_pConfDlg->m_pMediaController)
    m_pConfDlg->m_pMediaController->SetPlayVolume(nPos);
    CPaintDC dc(this);
    CRect rect;
    CBitmap Bmp;
    BITMAP bitmap;
    CDC memDC;
    GetClientRect(&rect);
    Bmp.LoadBitmap(IDB_BITMAP2);
    memDC.CreateCompatibleDC(&dc);
    memDC.SelectObject(&Bmp);
    Bmp.GetBitmap(&bitmap);
    dc.StretchBlt(0,725,nPos,100,&memDC,0,10,120,153,SRCCOPY);//nPos动态改变长度
    Bmp.DeleteObject();
    但是背景没有显示,StretchBlt是不是一定要放在OnPaint()里面才有用?
      

  5.   

    也有可能是画完之后,有立刻被重绘了,所以没显示出来,你可以放OnPaint里,然后在
    void CLeftBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)函数里
    Invalidate()来触发重绘