mfc/vc slider control控件 鼠标左键点击后直接滑到点击的位置
2017-09-21 15:08
519 查看
在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);
}
建议使用方法一;方法二需要添加键盘左右键事件以及鼠标移动事件否则进行对应操作无效
方法一:
也是重载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);
}
建议使用方法一;方法二需要添加键盘左右键事件以及鼠标移动事件否则进行对应操作无效
相关文章推荐
- MFC/VC中怎样实现slider滑块控件鼠标点击那里,就刚好落到点击位置
- MFC 获取picture控件的鼠标点击坐标位置的方法
- MFC 获取picture控件的鼠标点击坐标位置的方法(PreTranslateMessag)
- MFC 获取picture控件的鼠标点击坐标位置的方法
- 写新类让VC Slider控件,根据鼠标单击位置来显示滑块位置!
- VS2010/MFC 获取ListControl鼠标点击位置
- MFC 获取picture控件的鼠标点击坐标位置的方法
- VC Slider控件,根据鼠标单击位置来显示滑块位置!
- 鼠标在slide控件的任意位置上点击,滑块滑动到该位置是如何实现的,有什么属性吗?
- VC MFC 获取屏幕大小 程序窗口大小位置 控件大小位置
- MFC-控件大全-Slider Control(转)
- VC MFC系统托盘右键菜单,鼠标点击非菜单区域使菜单消失的问题
- MFC如何获取控件相对于窗口的左边,以及鼠标相对于控件的位置
- MFC-控件大全-Slider Control(转)
- VC 透明滑动控件Slider Control
- vc鼠标点击窗体任意位置移动窗体代码
- MFC-三个基本控件、SliderControl、HotKey以及ListControl
- MFC/VC 鼠标悬停在控件上方显示信息
- js获取鼠标点击位置(界面的位置,可以使用top和left直接定位的)
- mfc判断鼠标位置是否在控件上