在vc或mfc中我们有的时候需要用到slider control控件,但是这个控件有个问题事就不能随鼠标的点击落到点击的位置,怎样是实现呢?网上有两种办法一种是重载该类,这个方法在控件移到最后一段时总会跳最后,还有一种是自己画控件;不过比较麻烦,现在我说下我的方法:
方法一:
也是重载slider 此类,在此类中重载鼠标左单击事件如下:
void MySlider::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SendMessage(WM_KILLFOCUS,-1,0); //失去焦点
this->EnableWindow(FALSE);//设置不可用
CRect rect,rect2;
GetChannelRect(rect);//获取游标槽在拉动条的区域坐标
GetThumbRect(rect2);//获取游标在拉动条的区域坐标
int nMax = 0;
int nMin = 0;
GetRange(nMin,nMax);
int nDelta = nMax-nMin;
int nPos = ((point.x-rect.left)*nDelta)/(rect.right-rect.left);
if(nPos>nMax/2) nPos = ((point.x+(rect2.right-rect2.left)/2-rect.left)*nDelta)/(rect.right-rect.left);
CSliderCtrl::SetPos(nPos);
this->EnableWindow(TRUE);//设置可用
CSliderCtrl::OnLButtonDown( nFlags, point) ;
this->SetFocus();//获得焦点
}
方法二:
首先自己添加slider control控件,注意在属性中要将disabled设置为true;
接着添加鼠标左单击事件;
最后再生成的对应的添加处理,如下:
void WayOther::OnLButtonDown(UINT nFlags, CPoint point)
{
CSliderCtrl *pWnd;
pWnd= (CSliderCtrl *)GetDlgItem(IDC_SLIDER1); //获取ID为IDC_SLIDER1的空间的句柄
CRect rect,rect1,rect2;
pWnd->GetWindowRect(&rect); //获取IDC_SLIDER1窗口的大小
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
pWnd->GetChannelRect(rect1);//获取游标槽在IDC_SLIDER1中的区域坐标
pWnd->GetThumbRect(rect2);//获取游标在IDC_SLIDER1中的区域坐标
/***************************************计算鼠标点击的有效范围*****************************************/
rect.bottom = rect.top+rect2.bottom;
rect.top += rect2.top;
rect.right = rect.left + rect1.right;
rect.left += rect1.left;
if(point.x<rect.left||point.x>rect.right||point.y<rect.top||point.y>rect.bottom) return false;//判断鼠标点击是否是在有校范围内
int nMax = 0;
int nMin = 0;
pWnd->GetRange(nMin,nMax);获取设定的范围值
int nDelta = nMax-nMin;
int nPos = ((point.x-rect.left)*nDelta)/(rect.right-rect.left);
if(nPos>nMax/2) nPos = ((point.x+(rect2.right-rect2.left)/2-rect.left)*nDelta)/(rect.right-rect.left);//计算pos
pWnd->SetPos(nPos);//移动
CDialogEx::OnLButtonDown(nFlags, point);
}
建议使用方法一;方法二需要添加键盘左右键事件以及鼠标移动事件否则进行对应操作无效