Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1661207
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2009-06-18 11:40:45






              

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 组合框获得输入焦点。

   最后给出一段有关组合框的示例代码,从代码实现不难看出组合框控件同前面给出的列表控件在编程实现上的相似性。

一、如何添加/删除Combo Box内容
1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。

// 组合框的创建
// 创建列表控件
m_ctrComboBox.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | CBS_DROPDOWN, CRect(400, 50, 470, 150), this, IDC_COMBOX1);

  1、添加条目
CString Item[9] = {"Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9"};
for (int i = 0; i < 9; i++)
m_ctrComboBox.AddString(Item[i]);


 2、 在程序初始化时动态添加


    如: //控件内容初始化
   CString strTemp;
   ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除现有所有内容
    for(int i=1;i<=100;i++)
   {
       strTemp.Format("%d",i);
       ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
   }


3. 下拉的时候添加
    如: CString strTemp;
    int iCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount();//取得目前已经有的行数
    if(iCount<1)//防止重复多次添加
   {
       ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();
       for(int i=1;i<=100;i++)
      {
          strTemp.Format("%d",i);
          ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
       }
    }


 4、选中第4个条目
m_ctrComboBox.SetCurSel(3);

5、 删除
   DeleteString( UINT nIndex )//删除指定行,

6、插入
   InsertString( int nIndex, LPCTSTR lpszItem )//将行插入到指定位置

7、查找
   FindString( int nStartAfter, LPCTSTR lpszItem )//可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
   int SelectString( int nStartAfter, LPCTSTR lpszItem )//可以选中包含指定字符串的行


……
// 通知消息响应函数的声明(在头文件中)
//{{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));
}


二、如何控制Combo Box的下拉长度

1. 首先要知道两点:一、那就是在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是Combo Box的下拉调整框。

2. 二、属性里有个 No integral height 钩选项,表示最大长度为设计长度,如果实际内容比设计长度多,就出现滚动条,少就以实际长度显示。

三、选择其中的某行
1. 选中:
int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel();//当前选中的行。
2. 设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n)//设置第n行内容为显示的内容。

四、取得Combo Box框内容
1. 取当前内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);

2. 取其他行内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);

四、获得焦点
    通常要判断控件是否获得了焦点,可以用GetFocus()函数
 
例如:
 if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。
但是combobox 的焦点不同,因为它是由edit和listbox两部分组成的
所以获得焦点要用GetParent():if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))


阅读(2043) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~