CSample02View)
ON_LBN_DBLCLK(IDC_LIST1, OnLbnDblClk)
//}}AFX_MSG_MAP
// Standard printing commands
END_MESSAGE_MAP()
……
// 父窗口对LBN_DBLCLK通知消息的处理
void CSample02View::OnLbnDblClk()
{
// 得到当前选中条目的索引
int Index = m_ctrListBox.GetCurSel();
// 得到此条目的内容
char Text[20];
m_ctrListBox.GetText(Index, Text);
// 以信息框报告得到的内容
AfxMessageBox(CString(Text));
}
虽然组合框实际是列表框和编辑框的组合,但在使用中的表现使得组合框同其他控件一样当作一个独立的控件去使用。MFC的CComboBox类提供了对组合框的功能支持。在使用Create()函数创建组合框时可以同时指定组合框的风格(参见下表)。
窗口风格 说明
CBS_AUTOHSCROLL 当在行尾输入字符时自动将编辑框中的文字向右滚动。
CBS_DROPDOWN 同CBS_SIMPLE风格类似,只是只有在用户点击下拉图标时才会显示出下拉列表。
CBS_DROPDOWNLIST 同CBS_DROPDOWN类似,只是显示当前选项的编辑框为一静态框所代替。
CBS_HASSTRINGS 创建一个包含了由字串组成的项目的拥有者画组合框。
CBS_OEMCONVERT 将组合框中的ANSI字串转化为OEM字符。
CBS_OWNERDRAWFIXED 由下拉列表框的拥有者负责对内容的绘制;列表框中各项目高度相同。
CBS_OWNERDRAWVARIABLE 由下拉列表框的拥有者负责对内容的绘制;列表框中各项目高度可以不同。
CBS_SIMPLE 下拉列表始终显示。
CBS_SORT 自动对下拉列表中的项目进行排序。
CBS_DISABLENOSCROLL 当下拉列表显示内容过少时显示垂直滚动条。
CBS_NOINTEGRALHEIGHT 在创建控件时以指定的大小来精确设定组合框尺寸。
对组合框进行操作也会向父窗口发送通知消息,处理过程同前面几种控件大同小异,是通过ON_CBN消息映射宏完成对通知消息的映射的。下面就给出这些ON_CBN宏的详细说明:
ON_CBN宏 对应事件
ON_CBN_CLOSEUP 关闭下拉列表。
ON_CBN_DBLCLK 双击下拉列表中的项目。
ON_CBN_DROPDOWN 下拉显示列表框。
ON_CBN_EDITCHANGE 编辑框中文本内容被改动。
ON_CBN_EDITUPDATE 编辑框内容更新显示。
ON_CBN_ERRSPACE 组合框不能为某个特殊请求分配足够的内存。
ON_CBN_SELENDCANCEL 用户的选择被取消。
ON_CBN_SELENDOK 用户选择了一个项目并且通过回车键或按下鼠标而隐藏组合框的下拉列表。
ON_CBN_KILLFOCUS 组合框失去焦点。
ON_CBN_SELCHANGE 选择发生变化。
ON_CBN_SETFOCUS 组合框获得输入焦点。
最后给出一段有关组合框的示例代码,从代码实现不难看出组合框控件同前面给出的列表控件在编程实现上的相似性。
// 组合框的创建
// 创建列表控件
m_ctrComboBox.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | CBS_DROPDOWN, CRect(400, 50, 470, 150), this, IDC_COMBOX1);
// 添加条目
CString Item = {"Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9"};
for (int i = 0; i < 9; i++)
m_ctrComboBox.AddString(Item[i]);
// 选中第4个条目
m_ctrComboBox.SetCurSel(3);
……
// 通知消息响应函数的声明(在头文件中)
//{{AFX_MSG(CSample02View)
afx_msg void OnCbnSelChange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
……
// 对通知消息的响应处理(在实现文件中)
BEGIN_MESSAGE_MAP(CSample02View, CView)
//{{AFX_MSG_MAP(CSample02View)
ON_CBN_SELCHANGE(IDC_COMBOX1, OnCbnSelChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
……
void CSample02View::OnCbnSelChange()
{
// 得到当前选中条目的索引
int Index = m_ctrComboBox.GetCurSel();
// 得到此条目的内容
char Text[20];
m_ctrComboBox.GetLBText(Index, Text);
// 以信息框报告得到的内容
AfxMessageBox(CString(Text));
}
树形控件