【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3375|回复: 3

【集合】list box使用技巧~

[复制链接]
发表于 2007-2-7 10:17:46 | 显示全部楼层 |阅读模式

使用CStdioFile的ReadString读取一行,再用list   box的AddString   把读出的一行添加就可以了Top

2 楼Mackz(在相互)回复于 2003-11-24 01:17:03 得分 5

CStdioFile::ReadLine()Top

3 楼virsnow(virsnow)回复于 2003-11-24 09:34:10 得分 0

还有一个问题:那怎样删除list   Box的第一行?以及得到第五行的数据呢Top

4 楼bohut(●伯虎● )回复于 2003-11-24 10:19:00 得分 10

删除第0行:  
  DeleteString(   0   );  
  得到第5行:  
  GetText(   int   nIndex,   LPTSTR   lpszBuffer   );

 楼主| 发表于 2007-2-7 10:20:34 | 显示全部楼层

ListBox窗口用来列出一系列的文本,每条文本占一行。创建一个列表窗口可以使用成员函数:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。

LBS_MULTIPLESEL 指明列表框可以同时选择多行
LBS_EXTENDEDSEL 可以通过按下Shift/Ctrl键选择多行
LBS_SORT 所有的行按照字母顺序进行排序

在列表框生成后需要向其中加入或是删除行,可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )删除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )将行插入到指定位置。
void ResetContent( )可以删除列表框中所有行。
通过调用int GetCount( )得到当前列表框中行的数量。

如果需要得到/设置当前被选中的行,可以调用int GetCurSel( )/int SetCurSel(int iIndex)。如果你指明了选择多行的风格,你就需要先调用int GetSelCount( )得到被选中的行的数量,然后int GetSelItems( int nMaxItems, LPINT rgIndex )得到所有选中的行,参数rgIndex为存放被选中行的数组。通过调用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框内指定行的字符串。

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

在MFC 4.2版本中添加了CCheckListBox类,该类是由CListBox派生并拥有CListBox的所有功能,不同的是可以在每行前加上一个检查框。必须注意的是在创建时必须指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE风格。

通过void SetCheckStyle( UINT nStyle )/UINT GetCheckStyle( )可以设置/得到检查框的风格,关于检查框风格可以参考4.1 Button中介绍。通过void SetCheck( int nIndex, int nCheck )/int GetCheck( int nIndex )可以设置和得到某行的检查状态,关于检查框状态可以参考4.1 Button中介绍。

最后介绍一下列表框几种常用的消息映射宏:

ON_LBN_DBLCLK 鼠标双击
ON_EN_ERRSPACE 输入框无法分配内存时产生
ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生
ON_LBN_SELCHANGE 选择的行发生改变
使用以上几种消息映射的方法为定义原型如:afx_msg void memberFxn( );的函数,并且定义形式如ON_Notification( id, memberFxn )的消息映射。如果在对话框中使用列表框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。

 楼主| 发表于 2007-2-7 10:49:27 | 显示全部楼层
列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示.列表框具有边框,并且一般带有一个垂直滚动条.列表框分单选列表框和多重选择列表框两种.单选列表框一次只能选择一个列表项,而多重选择列表框可以进行多重选择.对于列表项的选择,
  应用程序用CreateWindowEx创建列表框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(style)。
常数说明
LBS_DISABLENOSCROLL固定显示垂直滚动条。未指定本项时,当列表未超出窗口,垂直滚动条自动隐藏。
LBS_EXTENDEDSEL使用键盘“SHIFT”键或另指定键加鼠标进行多选。
LBS_HASSTRINGS含有字符串的自绘式列表框.应用程序在自绘式列表框进行自绘时可以用LB_GETTEXT消息来取得列表项的文本。
LBS_MULTICOLUMN多列列表框,带有水平滚动条。应用程序可以用 LB_SETCOLUMNWIDTH 消息来为列表框指定列数。
LBS_MULTIPLESEL支持多重选择。列表项的选择状态随着用户对该项单击或双击鼠标而翻转。
LBS_NODATA本项已不被支持。
LBS_NOINTEGRALHEIGHT列表框的尺寸由应用程序而不是Windows指定.通常,Windows指定尺寸会使列表项的某些部分隐藏起来。
LBS_NOREDRAW禁止刷新。当选择发生变化时防止列表框被更新,可发送WM_SETREDRAW来改变该风格。
LBS_NOSEL禁止选择,列表项只能看,不能被选择。
LBS_NOTIFY当用户单击或双击鼠标时通知父窗口。
LBS_OWNERDRAWFIXED指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度。在控件被创建时父窗口将收到WM_MEASUREITEM 消息,当需要重绘时父窗口将收到 WM_DRAWITEM 消息。
LBS_OWNERDRAWVARIABLE指定自绘式列表框,并且列表项有不同的高度.在控件被创建时父窗口将收到WM_MEASUREITEM消息,当需要重绘时父窗口将收到 WM_DRAWITEM 消息。
LBS_SORT使插入列表框中的项按字母升序排列.
LBS_STANDARD使用默认风格,相当于指定了边框,垂直滚动条,字母升序排列和鼠标单双击通知消息这几项风格
LBS_USETABSTOPS使列表框在显示列表项时识别并扩展制表符(08h),缺省的制表宽度是32个对话框单位。
LBS_WANTKEYBOARDINPUT响应键盘输入。当控件拥有键盘输入焦点时,允许接收父窗口接收WM_VKEYTOITEM和WM_CHARTOITEM消息,输入字符。

  应用程序可以通过调用SendMessage向控件发送如下消息来设定和查询控件各种参数。
uMsgwParamlParam说明
LB_ADDFILE0文件名地址增加文件名。
LB_ADDSTRING0字符串地址追加一个列表项。如果指定了LBS_SORT风格,表项将被重排序,否则将被追加在列表框的最后一项。
LB_DELETESTRING列表项序号0删除指定的列表项,
LB_DIRDDL_ARCHIVE指向通配符地址在列表框中列出文件名,必须是当前路径内,符合指定通配符,存档属性的文件名。
DDL_DIRECTORY在列表框中列出当前路径的子文件夹。子文件夹名前后将加上一对方括号"
  • "
  • DDL_DRIVES在列表框中列出本机的所有驱动器名。驱动器名前后将加上一对方括号和减号"[-*-]"
    DDL_EXCLUSIVE只列出指定属性的文件名,默认情况下是所有可读写文件都列出。如果没有指定任何文件属性,则不列出文件名。
    DDL_HIDDEN列出隐藏属性的文件名。
    DDL_READONLY列出只读属性的文件名。
    DDL_READWRITE列出读写属性的文件名。
    DDL_SYSTEM列出系统属性的文件名。
    LB_FINDSTRING开始表项序号字符串地址查找匹配字符串,忽略大小写,从指定开始表项序号开始查找,当查到某表项的文本字符串的前面包括指定的字符串则结束,找不到则转到列表框第一项继续查找,直到查完所有表项,如果wParam为-1则从列表框第一项开始查找,如果找到则返回表项序号,否则返回LB_ERR。如:表项字符串为"abc123"和指定字串"ABC"就算匹配。
    LB_FINDSTRINGEXACT开始表项序号字符串地址查找字符串,忽略大小写,与LB_FINDSTRING不同,本操作必须整个字符串相同。如果找到则返回表项序号,否则返回LB_ERR。
    LB_GETANCHORINDEX00返回鼠标最后选中的项的索引
    LB_GETCARETINDEX00返回具有矩形焦点的项的索引
    LB_GETCOUNT00返回列表项的总项数,若出错则返回LB_ERR.
    LB_GETCURSEL00本操作仅适用于单选择列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则返回LB_ERR.
    LB_GETHORIZONTALEXTENT00返回列表框的可滚动的宽度(象素)
    LB_GETITEMDATA索引0每个列表项都有一个32位的附加数据.该函数返回指定列表项的附加数据。若出错则函数返回LB_ERR.
    LB_GETITEMHEIGHT索引0返回列表框中某一项的高度(单位:象素)
    LB_GETITEMRECT索引RECT结构地址获得列表项的客户区的RECT
    LB_GETLOCALE00取列表项当前用于排序的语言代码,当用户使用LB_ADDSTRING向组合框中的列表框中添加记录并使用LBS_SORT风格进行重新排序时,必须使用该语言代码。返回值中高16位为国家代码。
    LB_GETSEL索引0返回指定列表项的状态。如果查询的列表项被选择了,函数返回一个正值,否则返回0,若出错则返回LB_ERR。
    LB_GETSELCOUNT00本操作仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR.
    LB_GETSELITEMS数组的大小缓冲区本操作仅用于多重选择列表框,用来获得选中的项的数目及位置。参数lParam指向一个整型数数组缓冲区,用来存放选中的列表项的索引。wParam说明了数组缓冲区的大小。本操作返回放在缓冲区中的选择项的实际数目,若出错函数返回LB_ERR.
    LB_GETTEXT索引缓冲区用于获取指定列表项的字符串。参数lParam指向一个接收字符串的缓冲区.wParam则指定了接收字符串的列表项索引。返回获得的字符串的长度,若出错,则返回LB_ERR。
    LB_GETTEXTLEN索引0返回指定列表项的字符串的字节长度。wParam指定了列表项的索引.若出错则返回LB_ERR。
    LB_GETTOPINDEX00返回列表框中第一个可见项的索引,若出错则返回LB_ERR.
    LB_INITSTORAGE表项数内存字节数本操作只适用于Windows95版本,当你将要向列表框中加入很多表项或有很大的表项时,本操作将预先分配一块内存,以免在今后的操作中一次一次地分配内存,从而加快程序运行速度。
    LB_INSERTSTRING索引字符串地址在列表框中的指定位置插入字符串。wParam指定了列表项的索引,如果为-1,则字符串将被添加到列表的末尾。lParam指向要插入的字符串。本操作返回实际的插入位置,若发生错误,会返回LB_ERR或LB_ERRSPACE。与LB_ADDSTRING不同,本操作不会导致LBS_SORT风格的列表框重新排序。建议不要在具有LBS_SORT风格的列表框中使用本操作,以免破坏列表项的次序。
    LB_ITEMFROMPOINT0位置获得与指定点最近的项的索引,lParam指定在列表框客户区,低16位为X坐标,高16位为Y坐标。
    LB_RESETCONTENT00清除所有列表项。
    LB_SELECTSTRING开始表项序号字符串地址本操作仅适用于单选择列表框,设定与指定字符串相匹配的列表项为选中项。本操作会滚动列表框以使选择项可见。参数的意义及搜索的方法与LB_FINDSTRING类似。如果找到了匹配的项,返回该项的索引,如果没有匹配的项,返回LB_ERR并且当前的选中项不被改变。
    LB_SELITEMRANGETRUE或FALSE范围本操作仅用于多重选择列表框,用来使指定范围内的列表项选中或落选.参数lParam指定了列表项索引的范围,低16位为开始项高16位为结束项。如果参数wParam为TRUE,那么就选择这些列表项,否则就使它们落选。若出错函数返回LB_ERR。
    LB_SELITEMRANGEEX起点终点本操作仅用于多重选择列表框,若指定终点大于起点则设定该范围为选中,若指定起点大于终点则设定该范围为落选。
    LB_SETANCHORINDEX索引0设置鼠标最后选中的表项成指定表项
    LB_SETCARETINDEX索引TRUE或FALSE设置键盘输入焦点到指定表项,若lParam为TRUE则滚动到指定项部份可见,若lParam为FALSE则滚动到指定项全部可见。
    LB_SETCOLUMNWIDTH宽度(点)0设置列的宽度。
    LB_SETCOUNT项数0设置表项数目
    LB_SETCURSEL索引0本操作仅适用于单选择列表框,设置指定的列表项为当前选择项。本操作会滚动列表框以使选择项可见。参数wParam指定了列表项的索引,若为-1,那么将清除列表框中的选择。若出错函数返回LB_ERR。
    LB_SETHORIZONTALEXTENT宽度(点)0设置列表框的滚动宽度。
    LB_SETITEMDATA索引数据值更新指定列表项的32位附加数据。
    LB_SETITEMHEIGHT索引高度(点)指定列表项显示高度,带有LBS_OWNERDRAWVARIABLE(自绘列表项)风格的控件,只设置由wParam指定项的高度,其它风格将更新所有的列表项的高度。
    LB_SETLOCALE语言代码0取列表项当前用于排序的语言代码,当用户使用LB_ADDSTRING向组合框中的列表框中添加记录并使用LBS_SORT风格进行重新排序时,必须使用该语言代码。返回值中高16位为国家代码。
    LB_SETSELTRUE或FALSE索引本操作仅适用于多重选择列表框,它使指定的列表项选中或落选。参数lParam指定了列表项的索引,若为-1,则相当于指定了所有的项。参数wParam为TRUE时选中列表项,否则使之落选。若出错则返回LB_ERR。
    LB_SETTABSTOPS站数索引顺序表设置列表框的光标(输入焦点)站数及索引顺序表。
    LB_SETTOPINDEX索引0用来将指定的列表项设置为列表框的第一个可见项,该函数会将列表框滚动到合适的位置。wParam指定了列表项的索引.若操作成功,返回0值,否则返回LB_ERR。

      当用户在列表框上进行各种操作时,其父窗口将收到WM_COMMAND通知消息,同时wParam的低16位带控件的ID。lParam带控件句柄(hWnd),wParam的高16位带有如下表的消息代码。
    消息代码说明
    LBN_DBLCLK用户单击了列表项。
    LBN_ERRSPACE列表框无法申请到足够的内存空间。
    LBN_KILLFOCUS列表框失去输入焦点。
    LBN_SELCANCEL取消选择列表项。
    LBN_SELCHANGE列表框的选择项即将被改变。
    LBN_SETFOCUS列表框得到键盘输入焦点。
     楼主| 发表于 2007-2-7 10:52:43 | 显示全部楼层
    列表框是窗口类名为"ListBox"的预定义子窗口,在窗口矩形内包含有一些可以滚动显示的栏状字符串列表。标准的列表框只能允许选中一个条目,选中的条目将以系统颜色COLOR_HIGHLIGHT高亮显示。Windows还提供了多种不同风格的标准列表框,其中包括多选列表框、多列显示的列表框和可以显示图象的拥有者画(Owner-draw)列表框等。另一种与列表框相关的控件是组合框,该控件预定义类名为"COMBOBOX",实际是一个编辑控件同一个彼此相关的列表框控件的组合。用户既可以在组合框的编辑栏上直接输入、编辑文字也可以从下拉列表中显示的可能选择中进行选取。

      MFC的CListBox 类封装了列表框控件,由成员函数Create()完成对列表框的创建,在创建的同时指定了控件的窗口风格。当列表框中的条目被选中或被鼠标双击后将向父窗口发送WM_COMMAND消息。如果列表框采用了LBS_NOTIFY风格,父窗口就可以通过ON_LBN消息映射宏直接将通知消息同消息处理函数建立起映射关系。列表框提供了十余种窗口风格,现将列表框风格及说明列表如下:

    列表框风格 说明
    LBS_STANDARD创建一个具有边界和垂直滚动条、当选择发生变化或条目被双击时能够通知父窗口的标准列表框。所有条目按字母排序。
    LBS_SORT 按字母排序。
    LBS_NOSEL条目可视但不可选。
    LBS_NOTIFY当用户选择或双击一个串时,发出消息通知父窗口。
    LBS_DISABLENOSCROLL在条目不多时依然显示并不起作用的滚动条。
    LBS_MULTIPLESEL允许条目多选。
    LBS_EXTENDEDSEL可用SHIFT和鼠标或指定键组合来选择多个条目。
    LBS_MULTICOLUMN 允许多列显示。
    LBS_OWNERDRAWVARIABLE创建一个拥有者画列表框,条目高度可以不同。
    LBS_OWNERDRAWFIXED创建一个具有相同条目高度的拥有者画列表框。
    LBS_USETABSTOPS允许使用TAB制表符。
    LBS_NOREDRAW 当条目被增删后不自动更新列表显示。
    LBS_HASSTRINGS 记忆了添加到列表中的字串。
    LBS_WANTKEYBOARDINPUT当有键按下时向父窗口发送WM_VKEYTOITEM或WM_CHARTOITEM消息。
    LBS_NOINTEGRALHEIGHT按程序设定尺寸创建列表框。

      缺省的,列表框在每添加或删除一个条目后都会自动重绘,如果在列表框中已经有了几百条甚至上千条条目,将会因为重绘而引起比较严重的闪烁。可以通过使用LBS_NOREDRAW风格来禁止列表框的自动重绘。在需要更新显示时强制重绘列表框窗口即可。如果在创建时未使用LBS_NOREDRAW风格,可以在增删条目前向列表框发送WM_SETREDRAW消息,指定其不重绘,增添完毕后再次发送WM_SETREDRAW消息重新启用自动重绘风格。示例过程如下:

    CListBox m_ctrListBox;
    // 禁止自动重绘
    m_ctrListBox.SendMessage(WM_SETREDRAW, FALSE, 0);
    // 进行条目增删操作
    ……
    // 允许自动重绘
    m_ctrListBox.SendMessage(WM_SETREDRAW, TRUE, 0);

      列表框创建之初是不含任何条目的,通过CListBox成员函数AddString()和InsertString()向列表框增添或插入条目。如果列表框具有LBS_SORT风格,那么新添加字串的位置是不固定的,要根据字串的字母进行排序;如果不具有该风格,新字串将添加到列表框的末尾。

      如果有必要,可以使用SetItemDataPtr()或SetItemData()将一个32位的指针(或一个DWORD的值)同列表框中的一个条目联系起来,并且在设置后可以通过调用GetItemDataPtr()或GetItemData()而获取。这样做的目的是可以将列表框中的条目同外部数据建立联系。例如:可以用这种方式非常方便地将一个包含有地址、电话号码和E-mail地址等信息的数据结构同列举在列表框中的持有人建立起关联。当从列表框中选中某个人时,可以同时得到有关该人的通讯信息。

      当操作列表框时,将会通过WM_COMMAND消息发送通知给父窗口,消息参数lParam的高字节包含了通知码标识符。在MFC应用程序中,列表框的通知消息通过ON_LBN消息映射宏而映射到类成员函数。下表给出了列表框的几个通知消息以及相应的ON_LBN宏。其中,LBN_DBLCLK,LBN_SELCHANGE和LBN_SELCANCEL通知消息只有在列表框使用了LBS_NOTIFY或LBS_STANDARD风格时才会被发出,其他通知消息则无此限制。

    通知码标识符ON_LBN宏含义
    LBN_SETFOCUSON_LBN_SETFOCUS4 列表框接收到输入焦点
    LBN_KILLFOCUSON_LBN_KILLFOCUS5 列表框接失去输入焦点
    LBN_ERRSPACEON_LBN_ERRSPACE-2 列表框存储溢出
    LBN_DBLCLKON_LBN_DBLCLK 2 双击条目
    LBN_SELCHANGE ON_LBN_SELCHANGE 1 改变选择
    LBN_SELCANCELON_LBN_SELCANCEL3 取消选择

      其中,最经常使用的两个通知消息是LBN_DBLCLK和LBN_SELCHANGE。对于不可复选的列表框可以通过GetCurSel()来获取当前双击的是列表框条目的索引值;对于允许多选的列表框则需要用GetCaretIndex()来代替GetCurSel()。下面通过一段示例代码对列表控件的使用做一个直观的演示:

    // 创建并初始化列表框
    // 创建列表框
    m_ctrListBox.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | LBS_STANDARD,CRect(270, 50, 370, 150), this, IDC_LIST1);
    // 添加条目
    CString Item[9] = {"Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9"};
    for (int i = 0; i < 9; i++)
    m_ctrListBox.AddString(Item);
    // 选中第4个条目
    m_ctrListBox.SetCurSel(3);
    ……
    // 父窗口对通知消息的处理函数的声明(在头文件中)
    //{{AFX_MSG(CSample02View)
    afx_msg void OnLbnDblClk();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    ……
    // 父窗口对通知消息的映射入口 (在实现文件中)
    BEGIN_MESSAGE_MAP(CSample02View, CView)
    //{{AFX_MSG_MAP(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[9] = {"Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9"};
    for (int i = 0; i < 9; i++)
    m_ctrComboBox.AddString(Item);
    // 选中第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));
    }
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

    GMT+8, 2025-2-6 07:04

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表