mfc/vc slider control控件 鼠标左键点击后直接滑到点击的位置

在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);
}

建议使用方法一;方法二需要添加键盘左右键事件以及鼠标移动事件否则进行对应操作无效


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值