返回首页

简介
我的应用程序需要减少4个边缘的矩形对象,maximumnbsp(左,上,右,底部);减少为所有边缘的金额是100%

下面的图片显示为减少允许3例。顶部边缘。{S0}
这是不容易实现用户的任务,不过,我提供一个合适的控制,所以我创建了2个按钮,可以向内移动滑块,但不能重叠或相互交叉。
下面的界面是一个示例程序,其中包含2个水平和垂直滑块2的屏幕截图。文件,类,函数和消息文件和类
目录quot; libquot;里面的示例程序包含4个文件:SliderBoth和SliderBothBtn(H和CPP)

2类继承,每个文件与该文件相同的名称的一类。从CWnd - 滑块属于MFC问题。
SliderBoth类是主要的控制,SliderBothBtn是你只需要包括在thenbsp SliderBoth的SliderBoth按钮类
;文件,在其中使用滑块。功能类SliderBoth

BOOL Create(CWnd*pMum,CRect rcBd,BOOL bHorz,int iID)

bHorz:如果是水平或垂直滑块
IID:控制滑块ID,它必须是独特的父窗口(类似按钮或菜单ID)
rcBd:矩形滑块,但它的宽度或高度是固定的没有矩形(见功能的MoveWindow (...)下面)的影响。{C}
最小,最大和滑块的tick值,它必须是:
iMaxgt; IMIN,iTickgt; 0(IMAX - IMIN)%2 == 0,(IMAX IMIN)%iTick == 0Because滑块在中间绘制一个较长的打勾符号,我的程序。
您可以通过修改源代码中删除最后2限制容易。
GetRange(int&iMin,int&iMax,int&iTick)

获取滑块的范围和刻度值
GetPosition(int&iL,int&iR) 

//and 

SetPosition(int iL,int iR)


IL分别指向左或底部horizo​​ntalnbsp按钮的位置;或垂直滑块设置按钮的位置。
void MoveWindow(CRect*pRect,BOOL bRepaint=TRUE)

void MoveWindow(int iX,int iY,int iW,int iH,BOOL bRepaint=TRUE) 

覆盖CWnd的两个功能相关的功能,移动水平滑块的高度或宽度垂直slidernbsp;一直到27像素。
通常你只需要调用Create()和SetRange()函数。消息
如果鼠标是释放移动滑块的按钮后(WM_LBUTTONUP),一个消息是发布PostMessage的()的格式滑块到它的父窗口:
消息 WM_COMMAND消息, wParam参数:滑块的ID, lParam:一个 零(未使用)
(slidernbsp;只使用thisnbsp;消息)。
父窗口上的消息调用函数GetPosition (...)获得的滑块按钮位置

消息被发送。
如果按钮位置不变,移动后 - 例如移动到左,那么先前的立场的权利。
注意:这是很容易修改的源代码,如果你neednbsp;消息,而鼠标是moving.nbsp; 结论
我的文章,包括这一个,纯粹是从我的测试应用程序,我没有任何额外的时间来写一个真正的quot; articlequot;许多球员的地方 - 目前滑块perfectlynbsp;我的程序,这是所有我可以donbsp;阶段。
如果您发现错误或需要更多的功能在您的案件,请答复后,我可能会修改滑块,如果Inbsp;有一些时间day.nbsp;历史2006年8月9日:战后初期

回答

评论会员:evan369 时间:2011/12/06
我喜欢它
评论会员:超级驻军 时间:2011/12/06
我想有数量刷新不断当鼠标拖动一个按钮。我该怎么办呢?

多谢了!
评论会员:迪夫亚拉索 时间:2011/12/06
。使用WM_VSCROLL WM_HSCROLL(水平滑块)和垂直的
下面是一个未经测试的代码:

无效ZDlg:OnHScroll(nSBCode UINT,UINT的非营利组织,CScrollBar * pScrollBar)
{
/ / TODO:在此处添加消息处理程序代码和/或调用默认
CSliderCtrl * pSlider =(CSliderCtrl *)pScrollBar;


/ /这是被复制逐字从给定的源代码iPos1诠释iPos0,
pSlider - GT; GetPosition(iPos0,iPos1)
INT IMIN,IMAX,iTick;
pSlider - GT; GetRange(IMIN,IMAX,iTick)

CString的CS;
cs.Format("POS数:%d,%d条\ n \无机氮=%D,MAX =%D,打勾=%D",
iPos0,iPos1,IMIN,IMAX,iTick);
sta_Info.SetWindowText(csBar"滑块\ N \ nvalues​​:\ N"的"消息"CS)

}
的亲切问候,

迪夫亚拉索
www.adislindia.com
评论会员:mensfort 时间:2011/12/06
嗨,

对于我来说,还不能正常工作。我也看到你的滑块是不是一个CSliderCtrl。所以也许我应该调查什么消息被发送到父。我试图slider.SetParent(本);而且这种没有效果
Mensfort
的问候
评论会员:欧阳Bryk 时间:2011/12/06
您好,

我看见你的MESG。我也试图用鼠标拖动滑块。也许你已经解决了这一点,但我想我应该让你知道的情况下,你还没有。我发现,把这一行:

GetParent() - > PostMessage的(WM_USER + 1,b_Fst)
SliderBothBtn.cpp的OnMouseMove()事件处理程序,它迫使适当更新窗口的WindowProc(SliderBoth.cpp),并不断更新滑块的位置,当您移动鼠标。
这里是我的OnMouseMove()的代码。
无效SliderBothBtn:的OnMouseMove(UINT nFlags,口岸系统PT)
{
如果(b_BtnDn){
INT多孔氧化物;
(b_Horz)
多孔氧化物= pt.x - i_BtnDnPos;
ELSE
多孔氧化物= pt.y - i_BtnDnPos;
GetParent() - > PostMessage的(WM_USER,首次公开招股,b_Fst); / /移动BTN
GetParent() - > PostMessage的,b_Fst(WM_USER + 1); / / btnUp更新文本
}
的CWnd::的OnMouseMove(nFlags,PT);}
评论会员:欧阳Bryk 时间:2011/12/06
对不起,标签得到代码。我会做的可读性,它与一个代码块:

void SliderBothBtn::OnMouseMove(UINT nFlags, CPoint pt) 

{

	if (b_BtnDn) {

		int iPos;

		if (b_Horz)

			iPos = pt.x - i_BtnDnPos;

		else

			iPos = pt.y - i_BtnDnPos;

		GetParent()->PostMessage(WM_USER, iPos, b_Fst);	// btn moves

		GetParent()->PostMessage(WM_USER+1, b_Fst);	// btnUp update text

	}

 

	CWnd::OnMouseMove(nFlags, pt);

}


评论会员:尚书 时间:2011/12/06
谢谢你这段代码共享