ChoiceListButton 控件






4.88/5 (4投票s)
1999年12月15日

71098

1232
带复选框菜单项的下拉菜单按钮
摘要
我想要一个按钮,可以向用户显示一系列选项。我当然可以使用一个拥有绘制的组合框。但是,这个解决方案的问题是,当下拉列表折叠时,它将始终显示最后选择的项,而不是一些描述性文本。
这就是为什么我选择了一个自定义解决方案。
ITCLib
可选地,该控件可以使用来自 Interface technologies, Inc. 的免费库 'ITCLib'。这是一个很棒的库,我建议所有 MFC 开发人员都看一下它 - 它能节省大量时间。
ITCLib 只用于绘制按钮上的小箭头,因此不是控件的集成部分。这就是为什么所有对 ITCLib 的引用最初都通过预处理器语句禁用,所以即使在没有该库的安装上,示例也能正常编译。
启用 ITCLib
- 如果您已安装 ITCLib 并想启用它,请执行以下操作:
- 在“项目设置” - “C/C++” - “预处理器” - “预处理器定义”中,添加 _ITCDLL
- 在“项目设置” - “C/C++” - “预处理器” - “附加包含目录”中,添加包含 ITCLib 头文件的文件夹
- 在“项目设置” - “链接” - “输入” - “附加库路径”中,添加包含 ITCLib 库文件的文件夹
就是这样!
如果您想使用自己的按钮类来绘制箭头或任何其他您想在按钮表面上绘制的内容,您可以将 CChoiceWindowBtn
从您自己的类继承,而不是从 CButton
或 ITCImageButton
继承。
使用控件
要使用该控件,请创建一个项目并添加这些文件:
ChoiceWindow.h
ChoiceWindow.cpp
ChoiceWindowBtn.h
ChoiceWindowBtn.cpp
drop_arrow.bmp (或其他位图)
将该位图的资源名称设置为 "DROP_ARROW" - 请注意,是字符串形式,而不是整数 ID。
接下来,将一个按钮添加到对话框,并在您的 WM_INITDIALOG
处理程序中使用成员函数。
向对话框类添加一个 CChoiceWindowBtn
类型的对象。请务必添加头文件包含。
示例 - 注意预处理器定义的使用。
#ifdef _ITCDLL m_btnDropDown.SubclassControl(IDC_OPTIONS, this); m_btnDropDown.AddImage("DROP_ARROW", -1, RGB(255,0,255)); m_btnDropDown.SetImageAlign(DT_RIGHT|DT_VCENTER); #else m_btnDropDown.SubclassDlgItem(IDC_OPTIONS, this); #endif m_btnDropDown.AddChoice("Name", TRUE); m_btnDropDown.AddChoice("Address", TRUE); m_btnDropDown.AddChoice("Notes", FALSE); m_btnDropDown.AddChoice("Telephone", TRUE);
API
该控件通过 CChoiceWindowButton
类访问。它有一些简单的成员函数:
CChoiceWindowButton::AddChoice
void AddChoice(LPCTSTR szText, BOOL bChecked=FALSE)
返回值
无
参数
szText:要显示为选项的文本。
bChecked:该选项是否应初始选中。
备注
向列表中添加一个新选项。
CChoiceWindowButton::Reset
void Reset()
返回值
无
参数
无
备注
删除列表中的所有项。
CChoiceWindowButton::GetCheck
BOOL GetCheck(int iItem)
返回值
布尔值 - 由 iItem 指定的选项的状态。
参数
nItem:要查询状态的项的零基索引。
备注
如果选项带有复选标记,则返回 TRUE,如果选项未被用户选中,则返回 FALSE。
CChoiceWindowButton::SetCheck
void SetCheck(int iItem, BOOL bCheck=TRUE)
返回值
void
参数
iItem:要查询状态的项的零基索引。
bCheck:布尔值。如果为 TRUE,则该项被选中;否则,被取消选中。
CChoiceWindowButton::GetItemCount
int GetItemCount()
返回值
列表中的项数。
参数
无
CChoiceWindowButton::GetListCtrl
CListCtrl& GetListCtrl()
返回值
底层 CListCtrl 对象的引用
参数
无
备注
您可以像这样访问列表控件:
CListCtrl& list = btnChoiceList.GetListCtrl();
CChoiceWindowButton::RemoveAt
void RemoveAt(int iIndex)
返回值
无
参数
要从列表中移除的项的索引。
CChoiceWindowButton::m_bDisableIfEmpty
BOOL m_bDisableIfEmpty
备注
布尔值,指定如果选项列表不包含任何项,按钮是否被禁用。默认值为 TRUE。
CChoiceWindowButton::Reset
void Reset()
返回值
无
参数
无
备注
删除列表中的所有项。
CChoiceWindowButton::SetItemData
void SetItemData(int iIndex, DWORD dwData)
返回值
无
参数
iIndex - 要关联数据的项的索引,
dwData - 要与该项关联的 32 位值。这可以为零。
备注
将一个 32 位值与一个项关联。
CChoiceWindowButton::GetItemData
DWORD SetItemData(int iIndex)
返回值
DWORD - 与该项关联的 32 位值。
参数
iIndex - 要关联数据的项的索引,
备注
检索与一个项关联的 32 位值。
历史
1999 年 7 月
1.0 版本在 CodeGuru 上发布,名为 _"ChoiceListButton"_。
1999 年 8 月
在 CodeGuru.com 上发布了该类的小错误修复。
1999 年 12 月 15 日
在 CodeProject.com 上发布。
2000 年 2 月
1.0.2 版本在 CodeProject.com 上发布。添加了 SetItemData() 和 GetItemData() 成员函数。