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

自定义绘制的按钮和更智能的分组框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (10投票s)

2000年1月12日

viewsIcon

208982

downloadIcon

5635

一个简化单选按钮操作的类,以及另一个用于自定义绘制按钮的类

  • 下载演示项目 - 66 Kb
  • Sample Image - CustomButtons.gif

    第一部分. CRadioGroup:一个将单选按钮作为数组处理的 Groupbox 类

    有时,当你在一个组中有多个单选按钮时,你不想单独处理它们。CRadioGroup 是一个简单的类,允许你访问由 groupbox 界定的任何单选按钮,将其视为基于 1 的数组。

    类层次结构

    CObject 
       | 
       +-CCmdTarget 
             | 
             +-CWnd 
                 | 
                 +-CButton 
                      | 
                      +-CRadioGroup
    

    如何使用 CRadioGroup?

    要使用 CRadioGroup 类,只需在对话框中子类化一个 Groupbox,并使用 SetRadio()GetRadio() 方法来访问当前选择的单选按钮。我已将访问设置为基于 1 的(基于 0 的数组总是让我感到不安),但这可以很容易地更改。

    当与 CCustomButton 结合使用时,每当单击包含的单选按钮时,CRadioGroup 也会收到 BN_CLICKED 消息。 因此,对于一个组框内的任何数量的单选按钮,只需要一个处理程序。

    子类化 groupbox

    void CMyDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CCRadioGroupSampleDlg)
    	DDX_Control(pDX, IDC_GROUP1, m_Group1);
    	//}}AFX_DATA_MAP
    }
    

    通过 groupbox 处理单选按钮上的点击(注意:单选按钮必须是 CCustomButton 或派生自 CCustomButton
     

    ON_BN_CLICKED(IDC_GROUP1, OnGroup1)

    CRadioGroup 的代码位于 CRadioGroup.cpp/.h 中(参见源代码。)
     

    CRadioGroup 是如何工作的?

    该类只是遍历它所界定的自动单选按钮,并找到当前选中的一个。 如果这是第二个自动单选按钮,则 GetRadio() 将返回 1。 相反,SetRadio(1) 将选择这个按钮,取消选择当前选择的按钮。 很简单。

    第二部分. CCustomButton:通用用户绘制按钮

    当我开始编写 MFC 对话框代码时,我以为覆盖按钮的绘制会很容易。 我真是太傻了!

    我只想根据类型和当前状态绘制按钮,同时保留按钮的行为。 经过一些尝试和错误,我创建了一个类,允许标准按钮行为,但可以选择让用户处理所有绘制。 我还添加了一些额外的功能,包括

    • 用户定义的点击区域
    • 支持悬停行为
    • 简单动画

    类层次结构

    CObject
       | 
       +-CCmdTarget 
             | 
             +-CWnd 
                 | 
                 +-CButton
                      |
                      +-CCustomButton
    

    示例代码

    我包含了一系列自定义按钮的示例实现。 这些都派生自 CCustomButton,并在提供的示例代码中显示。

    • CCustomIconButton - 一个显示从工具栏样式条带位图中获取的居中图标的按钮,并且还支持简单的悬停效果
    • CCustomTextButton - 一个显示彩色文本的按钮
    • CAnimatingButton - 一个显示动画彩色文本的按钮
    • CRoundButton - 一个支持悬停效果的圆形按钮。 绘制圆形按钮的代码由 Chris Maunder 编写(版权 (c) 1998)。

    如何使用 CCustomButton

    1. 使用派生自 CCustomButton 的类子类化你的按钮。
    2. 要绘制你自己的按钮,只需覆盖以下 2 个方法
      virtual bool CustomDraw() const {return true;}
      virtual void OnDraw(CDC*,const CCustomButtonData& state)
      {
      	//Draw the button based on state flags in parameter 'state'
      }
      
    3. 要提供悬停效果,请覆盖以下 2 个方法
      virtual bool    HoverEffects()const{return true;}
      
      virtual void    OnHover(bool bEnteringButton)
      {
      	// Override OnHover() to provide non-drawing effect such as sounds.
      	// Any drawing effects while hovering can be added in OnDraw()
      }
      
    4. 要提供简单的动画,请调用 SetAnimation()

      void    SetAnimation(bool bActive,int nNoOfFrames=0, int nMillisecsPerFrame=10);
      //If set active OnDraw() will be called every 'nMillisecsPerFrame' with 
      //the frame variable 'CCustomButtonState::m_nFrame' incremented each time.
      

    有关更多信息,请参阅源代码中的注释。

    © . All rights reserved.