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






4.64/5 (10投票s)
2000年1月12日

208982

5635
一个简化单选按钮操作的类,以及另一个用于自定义绘制按钮的类
第一部分. 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
- 使用派生自
CCustomButton
的类子类化你的按钮。 - 要绘制你自己的按钮,只需覆盖以下 2 个方法
virtual bool CustomDraw() const {return true;} virtual void OnDraw(CDC*,const CCustomButtonData& state) { //Draw the button based on state flags in parameter 'state' }
- 要提供悬停效果,请覆盖以下 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() }
- 要提供简单的动画,请调用
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.
有关更多信息,请参阅源代码中的注释。