CSplitButton 类
CSplitButton
类表示拆分按钮控件。 当用户单击按钮的主要部分时,拆分按钮控件将执行一个默认行为,而当用户单击按钮的下拉箭头时,控件将显示一个下拉菜单。
语法
class CSplitButton : public CButton
成员
公共构造函数
名称 | 描述 |
---|---|
CSplitButton::CSplitButton | 构造 CSplitButton 对象。 |
公共方法
名称 | 描述 |
---|---|
CSplitButton::Create | 创建具有指定样式的拆分按钮控件,并将其附加到当前 CSplitButton 对象。 |
CSplitButton::SetDropDownMenu | 设置当用户单击当前拆分按钮控件的下拉箭头时显示的下拉菜单。 |
受保护方法
名称 | 描述 |
---|---|
CSplitButton::OnDropDown | 处理当用户单击当前拆分按钮控件的下拉箭头时系统发送的 BCN_DROPDOWN 通知。 |
备注
CSplitButton
类派生自 CButton 类。 拆分按钮控件是一个样式为 BS_SPLITBUTTON 的按钮控件。 当用户单击下拉箭头时,它会显示自定义菜单。 有关详细信息,请参阅按钮样式中的 BS_SPLITBUTTON 和 BS_DEFSPLITBUTTON 样式。
下图描绘了包含页导航控件和 (1) 拆分按钮控件的对话框。 已单击 (2) 下拉箭头,此时将显示 (3) 子菜单。
继承层次结构
CSplitButton
要求
标头: afxcmn.h
Windows Vista 及更高版本支持这个类。
这个类的附加要求在 Windows Vista 常见控件的生成需求中介绍。
CSplitButton::Create
创建具有指定样式的拆分按钮控件,并将其附加到当前 CSplitButton
对象。
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID);
参数
dwStyle
[in] 要应用于控件的样式的按位组合 (OR)。 有关详细信息,请参阅按钮样式。
rect
[in] 对 RECT 结构的引用,该结构包含控件的位置和大小。
pParentWnd
[in] 指向 CWnd 对象(控件的父窗口)的非空指针。
nID
[in] 控件的 ID。
返回值
如果此方法成功,则返回 TRUE;否则返回 FALSE。
CSplitButton::CSplitButton
构造 CSplitButton
对象。 构造函数的参数指定当用户单击拆分按钮控件的下拉箭头时显示的子菜单。
CSplitButton();
CSplitButton(
UINT nMenuId,
UINT nSubMenuId)
CSplitButton(CMenu* pMenu)
参数
nMenuId
[in] 菜单栏的资源 ID。
nSubMenuId
[in] 子菜单的资源 ID。
pMenu
[in] 指向指定子菜单的 CMenu 对象的指针。 当 CSplitButton
对象超出范围时,CSplitButton
对象将删除 CMenu
对象及其关联的 HMENU。
注解
使用 CSplitButton::Create 方法创建拆分按钮控件并将其附加到 CSplitButton
对象。
CSplitButton::OnDropDown
处理当用户单击当前拆分按钮控件的下拉箭头时系统发送的 BCN_DROPDOWN 通知。
afx_msg void OnDropDown(
NMHDR* pNMHDR,
LRESULT* pResult);
参数
pNMHDR
[in] 指向包含有关 BCN_DROPDOWN 通知的信息的 NMHDR 结构的指针。
pResult
[out](未使用;未返回任何值。)BCN_DROPDOWN 通知的返回值。
备注
当用户单击拆分按钮控件上的下拉箭头时,系统会发送 BCN_DROPDOWN 通知消息,OnDropDown
方法会处理该消息。 但是,CSplitButton
对象不会将 BCN_DROPDOWN 通知转发到包含拆分按钮控件的控件。 因此,包含控件无法支持自定义操作以响应通知。
若要实现包含控件支持的自定义操作,请使用具有 BS_SPLITBUTTON 样式的 CButton 对象,而不是 CSplitButton
对象。 然后,为 CButton
对象中的 BCN_DROPDOWN 通知实现处理程序。 有关详细信息,请参阅按钮样式。
若要实现拆分按钮控件本身支持的自定义操作,请使用消息反射。 从 CSplitButton
类派生自己的类并对其命名,例如 CMySplitButton。 然后,将以下消息映射添加到应用程序以处理 BCN_DROPDOWN 通知:
BEGIN_MESSAGE_MAP(CMySplitButton,
CSplitButton)
ON_NOTIFY_REFLECT(BCN_DROPDOWN, &CMySplitButton::OnDropDown)
END_MESSAGE_MAP()
CSplitButton::SetDropDownMenu
设置当用户单击当前拆分按钮控件的下拉箭头时显示的下拉菜单。
void SetDropDownMenu(
UINT nMenuId,
UINT nSubMenuId);
void SetDropDownMenu(CMenu* pMenu);
参数
nMenuId
[in] 菜单栏的资源 ID。
nSubMenuId
[in] 子菜单的资源 ID。
pMenu
[in] 指向指定子菜单的 CMenu 对象的指针。 当 CSplitButton
对象超出范围时,CSplitButton
对象将删除 CMenu
对象及其关联的 HMENU。
注解
nMenuId 参数标识菜单栏,它是菜单栏项的水平列表。 nSubMenuId 参数是一个从零开始的索引号,用于标识子菜单,它是与每个菜单栏项关联的菜单项的下拉列表。 例如,典型应用程序具有包含菜单栏项“文件”、“编辑”和“帮助”的菜单。“文件”菜单栏项具有包含菜单项“打开”、“关闭”和“退出”的子菜单。单击拆分按钮控件的下拉箭头时,控件将显示指定的子菜单,而不是菜单栏。
下图描绘了包含页导航控件和 (1) 拆分按钮控件的对话框。 已单击 (2) 下拉箭头,此时将显示 (3) 子菜单。
示例
以下代码示例中的第一个语句演示 CSplitButton::SetDropDownMenu 方法。 我们使用 Visual Studio 资源编辑器创建了菜单,该编辑器会自动将菜单栏 ID 命名为 IDR_MENU1。 nSubMenuId 参数(为零)指的是菜单栏的唯一子菜单。
// Initialize the dropdown menu of the splitbutton control.
m_splitButton.SetDropDownMenu(IDR_MENU1, 0);
// Create the pager control.
BOOL nRet;
CRect rect;
GetClientRect(&rect);
nRet = m_pager.Create(
(WS_VISIBLE | WS_CHILD | PGS_HORZ),
CRect(rect.Width() / 4, 5, (rect.Width() * 3) / 4, 55),
this,
IDC_PAGER1);
m_pager.GetClientRect(&rect);
nRet = m_button.Create(
_T("This is a very, very long button. 012345678901234567890"),
(WS_VISIBLE | WS_CHILD), // Do not use CCS_NORESIZE.
CRect(0, 0, rect.Width(), 30),
&m_pager, IDC_BUTTON1);
m_pager.SetChild(m_button.m_hWnd);
m_pager.SetButtonSize(20);
m_pager.SetBorder(1);