相关代码如下: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、我想实现滑块向右移动的过程中,怎样利用图片显示它走过的轨迹?就像一般音乐软件实现的效果
谢谢!!
{
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、我想实现滑块向右移动的过程中,怎样利用图片显示它走过的轨迹?就像一般音乐软件实现的效果
谢谢!!
解决方案 »
- MFC不同版本的程序之间互相调用问题,高手解答
- 为什么
- OpenGl中需要使用glext.h怎么才能获得?
- 请问:IDispatch error #3157是什么错误? ADO
- 如何对串口引脚电压进行初始化?
- 一个类与之间赋值的问题!
- 请问一下如何动态改变下拉框选项的文本??
- 我自己做的一个桌面的小软件,需要访问5000条以下的存储记录,只有查找,添加,修改,删除就可以了。是否用数据库,用什么数据库?
- --------------麻烦大家了,请问如何在一个SDI里,创建我期望中的大小,位置的对话框?-------------------
- VC如何接受从VB传来的数组?
- UI线程,可以多个主窗体吗
- 下了一段代码不能用,请大神指点,谢谢了
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.要想实现这个效果其实用不到这么麻烦,都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
自绘控件一般都这样的。
第二个问题,我是这样的,利用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()里面才有用?
void CLeftBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)函数里
Invalidate()来触发重绘