65.9K
CodeProject 正在变化。 阅读更多。
Home

带 2 个按钮的滑块

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.62/5 (21投票s)

2006 年 8 月 9 日

CPOL

2分钟阅读

viewsIcon

73227

downloadIcon

3013

带 2 个按钮的滑块。

引言

我的应用程序需要减少矩形对象的 4 个边(左、上、右、下),所有边的最大减少量为 100%。

下图显示了减少上边的 3 种情况。

除了我提供一个合适的控件之外,让用户实现这个任务并不容易,所以我创建了一个带有 2 个按钮的滑块,它可以向内移动,但不能重叠或互相穿过。

以下界面是示例程序的屏幕截图,其中包含 2 个水平滑块和 2 个垂直滑块。

文件、类、函数和消息

  1. 文件和类

    示例程序中的目录 "lib" 包含 4 个文件:SliderBothSliderBothBtn (H 和 CPP)。
    每个文件都有一个与文件名相同的类。
    这两个类都继承自 CWnd - 因此滑块属于 MFC 问题。

    SliderBoth 类是主控件,SliderBothBtn SliderBoth 的按钮类。
    您只需要在您使用滑块的文件中包含 SliderBoth

  2. SliderBoth 类的函数
    • BOOL Create(CWnd*pMum,CRect rcBd,BOOL bHorz,int iID)

      bHorz: 如果是水平或垂直滑块
      iID: 滑块的控件 ID,对于父窗口必须是唯一的(类似于按钮或菜单 ID)
      rcBd: 滑块的矩形,但其宽度或高度是固定的,不受矩形的影响(参见下面的函数 MoveWindow(...) )。

    • BOOL SetRange(int iMin,int iMax,int iTick)

      滑块的最小值、最大值和刻度值,它们必须是
      iMax>iMin, iTick>0 (iMax-iMin)%2==0, (iMax-iMin)% iTick==0因为滑块在中间为我的程序绘制了更长的刻度线。
      您可以通过修改源代码轻松删除最后 2 个限制。

    • GetRange(int&iMin,int&iMax,int&iTick)

      获取滑块的范围和刻度值

    • GetPosition(int&iL,int&iR) 
      //and 
      SetPosition(int iL,int iR)

      Get Set 按钮位置
      iL 分别表示水平或垂直滑块的左或下按钮位置。

    • void MoveWindow(CRect*pRect,BOOL bRepaint=TRUE)
      void MoveWindow(int iX,int iY,int iW,int iH,BOOL bRepaint=TRUE) 

      这两个函数重写了 CWnd 相关函数,将水平滑块的高度或垂直滑块的宽度移动到 27 像素。

    通常您只需要调用 Create() SetRange() 函数。

  3. Message

    如果鼠标在移动滑块按钮后释放 (WM_LBUTTONUP),则滑块会通过 PostMessage() 将消息以以下格式发布到其父窗口
    消息:WM_COMMANDwParam:滑块的 ID,lParam:零(未使用)
    (滑块仅使用此消息)。

    父窗口在消息上调用函数 GetPosition(...) 以获取滑块的按钮位置。

    未发送消息

    如果移动后按钮位置未更改 - 例如 移动到左侧然后右侧到以前的位置。

    注意:如果您需要鼠标移动时的消息,修改源代码非常容易。

结论

我所有的文章,包括这篇,都纯粹来自我的测试应用程序,我没有额外的空闲时间来像许多人在这个地方做的那样写一篇真正的“文章”——目前滑块在我的程序中运行完美,这就是我现阶段所能做的。

如果您发现错误或在您的案例中需要更多功能,请发表回复,如果我有时间,我可能会在某一天修改滑块。

历史

  • 2006 年 8 月 9 日:初始帖子
© . All rights reserved.