常用控件

CListBox

  后边两节讲了相比常用的开关控件,并因而开关控件实例证实了现实用法。本文要讲的是列表框控件(List博克斯)及其应用实例。


一:词条简要介绍

  列表框控件简单介绍

 

  CObject←CCmdTarget←CWnd←CListBox

  列表框给出了二个抉择项目清单,允许客商从当中举办单项或多项接收,被入选的项会高亮展现。列表框可分为单选列表框和多选列表框,看名就能够猜到其意义,单选列表框中一遍只可以选用叁个列表项,而多选列表框能够同期选用五个列表项。

ListBox窗口用来列出大器晚成多级的文件,每条文本占朝气蓬勃行。创造贰个列表窗口能够动用成员函数:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT&
rect, CWnd* pParentWnd, UINT nID = 0xffff );
个中dwStyle将指明该窗口的品格,除了子窗口常用的品格WS_CHILD,WS_VISIBLE外,你能够本着列表控件指明特地的品格。

  CList博克斯类提供Windows列表框的效用。列表框显示项的列表,如客户能够看来和挑选的文件名称。在单选列表框里,客商只可选择二个项。在多选列表框里,可筛选过多项。当客商筛选某项时,其高亮展现且列表框给父窗口发送三个文告音信。

  列表框也会向父窗口发送公告音信。那几个通告音讯含义如下:

  • LBS_MULTIPLESEL
    指明列表框能够何况选用多行
  • LBS_EXTENDEDSEL
    能够透过按下Shift/Ctrl键采纳多行
  • LBS_SORT
    全部的行依照字母逐风度翩翩实行排序

  可从对话模板或直接在您的代码中创设列表框。直接创建时,构造CList博克斯对象,再调用Create成员函数成立Windows列表框控件并将其附加给CListBox对象。要在对话模板中动用列表框,可在对话框类中声美素佳儿(Friso卡塔 尔(阿拉伯语:قطر‎个CListbox 变量,再在对话框类的DoDataExchange中使用DDX_Control连接成员变量到此控件(当向对话框类中增添控件变量时,ClassWizard自动为你实现卡塔 尔(英语:State of Qatar)。

  LBN_DBLCLK:顾客用鼠标双击了一列表项,独有全数LBS_NOTIFY的列表本事发送该信息。

在列表框生成后必要向里面参预或然删除行,能够使用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )删除钦命行,
int InsertString( int nIndex, LPCTSTRAV4 lpszItem )将行插入到钦点地点。
void ResetContent( )能够去除列表框中全数行。
因此调用int GetCount( )拿到当前列表框中央银行的多少。

  构造函数能够是从CListBox派生的类的叁个单步进度。为派生类写构造函数并从当中调用Create。假设要拍卖由列表框发送到其老爸(经常为从CDialog派生的类卡塔 尔(阿拉伯语:قطر‎的Windows布告新闻,为种种消息增添音信映射入口和音讯管理成员函数到父类。

  LBN_E奥德赛LacrosseSPACE:列表框不可能报名充裕的动态内部存款和储蓄器来满足急需。

若是须要获得/设置当前被入选的行,能够调用int GetCurSel( )/int
SetCurSel(int iIndex)。如若您指明了接纳多行的品格,你就需求先调用int
GetSelCount( )获得被选中的行的数据,然后int GetSelItems( int n马克斯Items,
LPINT rgIndex
)获得全部入选的行,参数rgIndex为贮存被选中央银行的数组。通过调用int
GetLBText( int nIndex, LPTST福睿斯 lpszText
)拿到列表框内内定行的字符串。

  每种新闻映射入口有以下方式:

  LBN_KILLFOCUS:列表框失去大旨。

除此以外通过调用int FindString( int nStartAfter, LPCTST奇骏 lpszItem
)可以在当前具备行中查找钦定的字符传的岗位,nStartAfter指明从那大器晚成行早先展开检索。
int SelectString( int nStartAfter, LPCTST本田CR-V lpszItem
)能够选中满含钦点字符串的行。

  ON_Notification( id,memberFxn )

  LBN_SELCANCEL:当前的挑肥拣瘦被注销,独有具备LBS_NOTIFY的列表框本领发送该音信。

在MFC
4.2版本中加多了CCheckListBox类,该类是由CListBox派生并具有CListBox的全部机能,不一致的是足以在每行前增加二个检查框。必需注意的是在开马上必需指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE风格。

  id 钦定发送公告的列表框控件的子窗口,memberFxn 是编辑管理通报的父成员函数名的地点。

  LBN_SETFOCUS:列表框获得输入大旨。

经过void SetCheckStyle( UINT nStyle )/UINT GetCheckStyle(
)能够安装/获得检查框的品格,关于检查框风格能够参照4.1
Button中牵线。通过void SetCheck( int nIndex, int nCheck )/int GetCheck(
int nIndex )可以安装和拿到某行的检讨情况,关于检查框状态能够参见4.1
Button中介绍。

  父函数原型如下:

  WM_CHARTOITEM:当列表框收到WM_CHA普拉多新闻后,向父窗口发送该音信,独有具备LBS_WANTKEYBOA揽胜DINPUT风格的列表框才会发送该新闻。

末尾介绍一下列表框两种常用的音讯映射宏:

  afx_msg void memberFxn( );

  WM_VKEYTOITEM:当列表框收到WM_KEYDOWN新闻后,向父窗口发送该音讯,唯有具备LBS_WANTKEYBOALX570DINPUT风格的列表框才会发送该消息。

  • ON_LBN_DBLCLK
    鼠标双击
  • ON_EN_E途驴母亲观SPACE
    输入框不或许分配内部存款和储蓄器时发生
  • ON_EN_KILLFOCUS
    / ON_EN_SETFOCUS 在输入框失去/获得输入宗旨时发出
  • ON_LBN_SELCHANGE
    选用的行发生转移

  上边是大概的音信映射入口列表和描述它们大概被发送到老爹的情事:

  列表框控件的开创

使用上述两种音信映射的法子为定义原型如:afx_msg void memberFxn(
);的函数,况兼定义方式如ON_Notification( id, memberFxn
)的新闻映射。尽管在对话框中使用列表框,Class
Wizard会自动列出有关的音信,并能自动发出新闻映射代码。

  ON_LBN_DBLCLK 客商双击列表框中的字符串。唯有LBS_NOTIFY风格的列表框才会发送此布告音讯。 

  MFC将列表框控件的兼具操作都卷入到了CListBox类中。

 

  ON_LBN_EEscortLacrosseSPACE 列表框不可能重新分配丰硕的内部存款和储蓄器来知足诉求。 

  成立列表框控件时,能够在对话框模板中央行政机构接拖入列表框控件ListBox,然后增多控件变量使用。但万一须求动态创设列表框,就要用到CListBox类的Create成员函数了。Create成员函数的原型如下:

  ON_LBN_KILLFOCUS 列表框正失去输入核心。 

  virtual BOOL Create(

  ON_LBN_SELCANCEL 当前列表框接受被撤消。此音讯只有在列表框是LBS_NOTIFY风格时才发送。 

    DWORD dwStyle,

  ON_LBN_SELCHANGE 列表框中的选用恐怕更换。假使选拔被CListBox::SetCurSel成员函数改动,则文告不发送。此文告只适用于LBS_NOTIFY风格的列表框。无论曾几何时客户按下箭头键,尽管采纳未更换,LBN_SELCHANGE公告信息都被发送给多选列表框。 

    const RECT& rect,

  ON_LBN_SETFOCUS 列表框正在选取输入宗旨。 

    CWnd* pParentWnd,

  ON_WM_CHARTOITEM 多少个无字符串的自绘制列表接纳WM_CHAR消息。 

    UINT nID

  ON_WM_VKEYTOITEM LBS_WANTKEYBOA福特ExplorerDINPUT风格的列表框选择WM_KEYDOWN消息。 

  );

  就算在对话框中结构一个CListBox对象(通过对话能源卡塔 尔(阿拉伯语:قطر‎,当客户关闭对话框时,CListBox对象活动放任。

  参数rect钦命了列表框控件的职位和尺寸,pParentWnd为父窗口的指针,nID用于钦赐列表框控件的ID。最后终点讲讲参数dwStyle,它钦点了列表框的品格,以下是种种风格的印证:

  假使在窗口中构造二个CListBox对象,大概需求毁弃CListBox对象。如若在栈上创制CListBox对象,它会自行扬弃。如若利用new函数在堆上创设CList博克斯对象,必须对此指标调用delete来在客商关闭父窗口时毁弃它。

  LBS_EXTENDEDSEL:支持多重接受,在点击列表框项时按住Shift键或Ctrl键就能够选用八个项。

  假定在CListBox对象中分配内部存款和储蓄器,可覆盖CListBox析构程序释放分配的内存。

  LBS_MULTICOLUMN:钦点一个水准滚动的多列列表框,通过调用CListBox::SetColumnWidth来安装每列的幅度。

  #include <afxwin.h>

  LBS_MULTIPLESEL:辅助多种接收。列表项的选项情况随着顾客对该项单机或双击鼠标而扭曲。

请参阅:CWnd, CButton, CComboBox, CEdit, CScrollBar, CStatic 

  LBS_NOINTEGRALHEIGHT:列表框的尺码由应用程序并不是Windows钦定。常常,Windows钦赐尺寸会使列表项的少数部分掩没起来。

二:类成员

  LBS_NOREDRAW:当接受发生变化时防卫列表框被更新,可发送信息改造改动该风格。

  CListBox类的积极分子

  LBS_NOTIFY:当客户单击或双击鼠标时布告父窗口。

  构造函数 CList博克斯 构造一个CListBox对象 

  LBS_OWNERDRAWFIXED:钦命自绘式列表框,即由父窗口担任绘制列表框的内容,而且列表项具备相似的冲天。

  先导化 Create 创设Windows列表框并附加给CListBox对象 

  LBS_SORT:使插入列表框中的项按升序排列。

  InitStorage 为列表框的项和字符串预分配内部存款和储蓄器块 

  LBS_STANDACRUISERD:相当于钦定了WS_BORDER|WS_VSCROLL|LBS_SORT。

诚如操作: 

  LBS_USETABSTOPS:使列表框在展现列表项时识别并扩大制表符(‘\t’),默许的制表宽度是三十七个对话框单位。

GetCount 重返列表框中的字符串数目 

  LBS_WANTKEYBOA传祺DINPUT:允许列表框的父窗口选拔WM_VKEYTOITEM和WM_CHARTOITEM音讯,以响应键盘输入。

  GetHorizontalExtent 重返列表框的水平急剧,用像素表示 

  LBS_DISABLEENOSCROLL:使列表框在无需滚动时浮现八个禁绝的垂直滚动条。

  SetHorizontalExtent 设置列表框的程度大幅度,用像素表示 

  dwStyle能够是上述所列风格的组合。与其他控件一样,除了那些风格相近还要为列表框控件设置WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等作风。平日成立单选列表框时,风格要设置为:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDA酷路泽D,假诺不希望列表框排序展现则应去掉LBS_STANDALacrosseD。创立多选列表框时,只供给在单选列表框风风格后加多LBS_MULTIPLESEL或LBS_EXTENDEDSEL风格。

  GetTopIndex 再次来到列表框中第多个可以见到字符串的索引 

  对于对话框模板中央行政单位接助长的列表框控件,其属性页中的属性也包括了上述风格,比如属性Multicolumn对应的正是LBS_MULTICOLUMN风格。

  SetTopIndex 设置列表框中第二个可知字符串的基于零的索引 

  CListBox类的珍视成员函数

  GetItemData 再次回到与列表框有关的叁十一人值 

  int GetCount() const;

  GetItemDataPtr 再次回到指向列表框的指针 

  重临值:重返列表框中列表项的数码,假设发生错误则赶回LB_ERR。

  SetItemData 设置列表框有关的三12位值 

 

  SetItemDataPtr 设置指向列表框的指针 

  int GetSel(int nIndex) const;

  GetItemRect 重返当前显示的列表框项的呼应矩形 

  参数:nIndex钦赐某些列表项的目录。

  ItemFromPoint 再次来到与某点近期的列表框项的索引 

  重临值:再次回到nIndex制订的列表项的状态。即使此列表项倍选拔了则赶回叁个正值,不然重临0,若爆发错误则赶回LB_ERR。

  SetItemHeight 设置列表框中项的可观 

 

  GetItemHeight 明确列表框中项的万丈 

  int SetSel(int nIndex, BOOL bSelect = TRUE);

  GetSel 重临列表框某项的精选 

  此函数用于多选列表框,使用它能够接纳或收回接纳钦定的列表项。

  GetText 拷贝某列表框项到缓冲区 

  参数:nIndex钦点有个别列表项的目录,若为-1则也正是钦命了具有列表项。bSelect为TRUE时采用制订列表项,不然撤销接纳列表项。

  GetTextLen 重临列表框的字节长 

  重返值:假如发生错误则赶回LB_ERR。

  SetColumnWidth 设置多列列表框的列宽 

 

  SetTabStops 设置列表框制表键结束职分 

  int AddString(LPCTSTR lpszItem);

  GetLocale 获取列表框之处标志符 

  此函数用来向列表框中增添字符串。如果列表框钦定了LBS_SORT风格,字符串就被以排序依次插入到列表框中,若无一点点名LBS_SORT风格,字符串就被增添到列表框的尾声。

  SetLocale 设置列表框之处标志符 

  参数:lpszItem钦定了要足够的字符串。

  单选操作 GetCurSel 再次回到列表框中当前增选串的依照零的索引 

  再次来到值:重回字符串在列表框中加多的岗位。假若产生错误则赶回LB_E冠道Koleos,内部存款和储蓄器相当不足则赶回LB_ERRSPACE。

  SetCurSel 采用二个列表框字符串 

 

  多选操作 SetSel 在多选列表框中精选或不选有些列表框项 

  int InsertString(int nIndex, LPCTSTR lpszItem);

  GetCaretIndex 明确在多选列表框中有卖得快矩形的项的索引 

  该函数用来在列表框中的钦命地方插入字符串。与AddString函数分歧的是,InsertString函数不会变成LBS_SORT风格列表框重新排序。不要在具备LBS_SORT风格的列表框中使用InsertString函数,避防破坏列表项的主次。

  SetCaretIndex 设置要点矩形到多选列表框中的钦点的目录项 

  参数:参数nIndex给出了插入地点(索引卡塔尔国,如果值为-1,则字符串将被增添到列表的末段。参数lpszItem钦赐了要插入的字符串。

  GetSelCount 重临多选列表框中当前增选的字符串的数目 

  重回值:再次来到实际的插入地点,若爆发错误,会回到LB_ERR或LB_ERRSPACE。

  GetSelItems 再次来到列表框中当前挑选的字符串的索引 

 

  SelItemRange 选取/不选多选列表框中的一些字符串 

  int DeleteString(UINT nIndex);

  SetAnchorIndex 设置多选列表框的锚点以开首扩展选用 

  该函数用于删除钦定的列表项。

  GetAnchorIndex 获取列表框当前锚点项的依赖零的索引 

  参数:nIndex钦点了要刨除项的目录。

字符串操作: 

  再次来到值:函数的再次来到值为结余的列表项数据,借使nIndex超越了实际上的列表项总数,则赶回LB_ERR。

AddString 增添一个字符串到列表框中 

 

  DeleteString 从列表框中删除多个字符串 

  void ResetContent();

  InsertString 在列表框中钦点地方插入一个字符串 

  该函数用于破除全数列表项。

  ResetContent 清空驶列车表框全数入口 

 

  Dir 从当前目录添Gavin件名称到列表框中 

  int GetText(int nIndex, LPCTSTR lpszBuffer) const;

  FindString 在列表框中探寻叁个字符串 

  void GetText(int nIndex, CString& rString) const;

  FindStringExact 查找与钦点的字符串相配的首先个列表框字符串 

  那五个分子函数用于获取钦点列表项的字符串。参数nIndex钦赐了列表项的目录。参数lpszBuffer指向贰个抽取字符串的缓冲区。引用参数rString则内定了收纳字符串的CString对象。第一个本子的函数会回到获得的字符串的尺寸,若出错,则赶回LB_E智跑R;第1个版本的函数则不会。

  SelectString 查找并采用单选列表框中的一个字符串 

 

  可覆盖的函数 DrawItem 当自绘制列表框的四个可视部分改动时,被框架调用 

  int GetTextLen(int nIndex) const;

  MeasureItem 当自绘制列表框创立时,被框架调用来规定列表框维数 

  该函数再次回到钦赐列表项的字符串的字节长度。

  CompareItem 被框架调用以分明生龙活虎层层列表框中某新项的地点 

  参数:nIndex钦赐了列表项的目录。

  DeleteItem 当顾客从自绘制列表框中除去某项时,被框架调用 

  重返值:若出错则赶回LB_ERR。

  VKeyToItem 覆盖以提供LBS_WANTKEYBOAQashqaiDINPUT风格列表框的设置所需的定制WM_KEYDOWN 

 

  CharToItem 覆盖以提供不含字符串的自绘制列表框定制WM_CHAR 

  int GetCurSel() const;

三:构造函数

  该函数仅适用于单选列表框,用来回到当前被选拔项的目录,若无列表项被筛选或有错误产生,则函数重返LB_ERR。

  CListBox::CListBox

  

  CListBox( );

  int SetCurSel(int nSelect);

  说明:

  该函数仅适用于单选列表框,用来接纳钦命的列表项。该函数会滚动列表框以使选用处可以知道。参数nIndex钦赐了列表项的目录,若为-1,那么将息灭列表框中的选拔。若出错函数重返LB_ERR。

  分两步构造叁个CListBox对象。首先调用构造函数CListBox,再调用Create,开头化Windows列表框并将其附加给CListBox。

 

  请参阅:CListBox::Create

  int GetSelCount() const;

 

  该函数仅用于多重选取列表框,它回到选拔项的数量,若出错函数返回LB_ERR。

 

  int FindString(int nStartAfter, LPCTSTR lpszItem) const;

  该函数用于对列表项进行与大小非亲非故的搜寻。参数nStartAfter内定了初步找出之处,合理钦赐nStartAfter能够加快搜索速度,若nStartAfter为-1,则从头初阶寻找整个列表。参数lpszItem钦赐了要寻找的字符串。函数重返与lpszItem钦命的字符串相相配的列表项的目录,若未有找到相称项或发生错误,则会回来LB_E奥迪Q5宝马X5。FindString函数想从nStartAfter钦赐的职责上马找寻,若没有找到匹配项,则会从头开始找出列表。独有找到相称项,或对任何列表搜索完叁遍后,搜索进度才会停下,所以不要忧虑会挂大器晚成漏万要搜索的列表项。

  

  int SelectString(int nStartAfter, LPCTSTR lpszItem);

  该函数仅适用于单选列表框,用来抉择与内定字符串相相配的列表项。该函数会滚动列表框以使采用途可以知道。参数的含义及搜寻的点子与函数FindString雷同。假如找到了合营的项,函数再次来到该项的目录,若无匹配的项,函数再次回到LB_ER帕杰罗何况当前的取舍不被改成。

  

  CListBox类应用实例

  最后给大家写三个简短的实例,表达CListBox的多少个分子函数及通告新闻等的选择方法。此实例达成的功能:在单选列表框中显得八个网址列表,然后再用鼠标左键采取某列表项时,将入选列表项的文本展现到编辑框中。上边是现实得以完成步骤:

  1、创设一个根据对话框的MFC工程,名称设置为”MFCListBox德姆o“。

  2、在自动生成的对话框模板IDD_MFCLISTBOXDEMO_DIALOG中,删除”TODO:Place
dialog controls
here.”静态文本框、“显著”按键和“撤消”按键。增多贰个ListBox控件,ID设置为IDC_WEB_LIST,Sort属性设为False,以撤除排序显示。再加多七个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“您接收的站点:”,编辑框的ID设为IDC_SEL_WEB_EDIT,Read
Only属性设为True。那个时候的对话框模板如下图:

图片 1

  3、为列表框IDC_WEB_LIST增多CListBox类型的控件变量m_listBox。

  4、在对话框初阶化时,大家将站点名参与到列表框,那么需求改正CMFCListBox德姆oDlg::OnInitDialog()函数为:

C++代码:

BOOL CMFCListBoxDemoDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码
    m_listBox.AddString(_T("新浪"));    // 在列表框末尾添加字符串“新浪”
    m_listBox.AddString(_T("博客园"));    // 在列表框末尾添加字符串“博客园”
    m_listBox.AddString(_T("猫扑"));    // 在列表框结尾处添加字符串“猫扑”
    m_listBox.AddString(_T("网易"));    // 在列表框结尾处添加字符串“网易”
    m_listBox.InsertString(2, _T("百度"));  // 在列表框中索引为2的位置插入字符串“百度”

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

  5、大家盼望在当选列表项改成时,将新型的接纳项实时突显到编辑框中,那么那将要用到LBN_SELCHANGE布告信息。为列表框IDC_WEB_LIST的打招呼音讯LBN_SELCHANGE加多音讯管理函数CMFCListBox德姆oDlg::OnLbnSelchangeWebList(),并修正如下:

C++代码:

void CMFCListBoxDemoDlg::OnLbnSelchangeWebList()
{
    // TODO: 在此添加控件通知处理程序代码
    CString strText;
    int nCurSel;

    nCurSel = m_listBox.GetCurSel();    // 获取当前选中列表项
    m_listBox.GetText(nCurSel, strText);    // 获取选中列表项的字符串
    SetDlgItemText(IDC_SEL_WEB_EDIT, strText);  //将选中列表项的字符串显示到编辑框中
}

  6、运营程序,弹出结果对话框,在对话框的列表中用鼠标改动选中项时,编辑框的来得会相应校正。效果图如下:

图片 2

  关于列表框ListBox的疏解就到此结束了。如若大家想试验更加多的列表框成员函数,能够在上头的小例子中插手越来越多的更能来心得。

 

相关文章