-
2019-09-10 13:14:41
在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也希望能编辑其参数。我以前在网上查找,用了CComboListCtrl,这需要3个cpp 和 h 文件,用起来还不容易。
最近看到一个文章 https://blog.csdn.net/qingyang8513/article/details/50986455 ,这个直接用 listctrl 和 一个Edit 控件,很简单。所以我也测试一下,并记录在此。
运行效果如下,点击一处列表框里内容即可编辑,但我剪辑图时剪辑不到编辑状态。
我的运行环境是vc2010,下面开始讲解过程:
重点内容:
1)List Control控件NM_DCLICK消息响应事件;
2)Edit Control的KillFocus消息响应;
3)Edit Control的动态显示及隐藏;
4)List Control获取指定行和列的编号,并获取指定行和列的内容及修改赋值。
操作:
1、创建基于对话框的MFC应用程序,删除原有的静态文本;
2、添加一个List Control控件和一个Edit Control控件,并分别关联控制变量m_ListTem和m_EditTest(List Control控件适当调整大小,Edit Control大小不用调整);
3、初始化对话框函数OnInitDialog中实现List Control控件和Edit Control控件的初始化, InitList(); UpdateList();
代码如下:
BOOL CListCtrlTestDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here InitList(); UpdateList(); return TRUE; // return TRUE unless you set the focus to a control } void CListCtrlTestDlg::InitList(void) { Clayer layer={"zhang",1.3,15.6,88}; m_layer.push_back(layer); Clayer layer1={"Li",22.3,25.6,288}; m_layer.push_back(layer1); Clayer layer2={"Wang",32.33,35.6,388}; m_layer.push_back(layer2); m_EditTest.ShowWindow(SW_HIDE); CRect rect; m_ListTem.GetClientRect(&rect); int iLength = rect.Width(); m_ListTem.SetExtendedStyle(m_ListTem.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_ListTem.InsertColumn(0, _T("编号"), LVCFMT_CENTER, 40); m_ListTem.InsertColumn(1, _T("名字"), LVCFMT_CENTER, 80); m_ListTem.InsertColumn(2, _T("x"), LVCFMT_CENTER, (iLength - 120)/3); m_ListTem.InsertColumn(3, _T("y"), LVCFMT_CENTER, (iLength - 120)/3); m_ListTem.InsertColumn(4, _T("旋转角度"), LVCFMT_CENTER, (iLength - 120)/3); } void CListCtrlTestDlg::UpdateList(void) { CString index,x,y,z,name,count,rotate,blocks; while(m_ListTem.GetItemCount()>0) m_ListTem.DeleteItem(0); for(int i=0;i<m_layer.size();i++) { index.Format("%d",i); Clayer& layer=m_layer[i]; name=layer.name; x.Format("%.2f",layer.x); y.Format("%.2f",layer.y); count.Format("%d",layer.count); m_ListTem.InsertItem(i,index); m_ListTem.SetItemText(i,1,name); m_ListTem.SetItemText(i,2,x); m_ListTem.SetItemText(i,3,y); m_ListTem.SetItemText(i,4,count); } }
在h 文件中定义层参数结构,并定义层参数向量m_layer.
typedef struct {CString name;float x;float y;int count;} Clayer;
std::vector<Clayer> m_layer;
有上面,上面代码才不报错。这里完成了初始显示,应该可以得到开头的效果,但不能编辑。
动态编辑的核心
4、对话框头文件中添加int型变量m_Row和m_Col,用于保存双击时选中的行和列号,并初始化为-1(未选中状态);
5、为List Control控件添加NM_DBLCLK消息响应,并添加代码如下:
void CListCtrlTestDlg::OnDblclkList2(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); // TODO: Add your control notification handler code here CRect rc; CString strTemp; NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR; m_Row = pNMListView->iItem; m_Col = pNMListView->iSubItem; if (pNMListView->iItem == -1) //选择空白处 return; if (m_Col != 0) // 选择子项 { m_ListTem.GetSubItemRect(m_Row, m_Col, LVIR_LABEL, rc); m_EditTest.SetParent(&m_ListTem); m_EditTest.MoveWindow(rc); m_EditTest.SetWindowText(m_ListTem.GetItemText(m_Row, m_Col)); m_EditTest.ShowWindow(SW_SHOW); m_EditTest.SetFocus();//设置Edit焦点 m_EditTest.ShowCaret();//显示光标 m_EditTest.SetSel(0, -1);//全选 } *pResult = 0; }
6、为Edit Control控件添加EN_KILLFOCUS消息响应,并添加代码如下:
void CListCtrlTestDlg::OnKillfocusEdit1() { // TODO: Add your control notification handler code here CString str; m_EditTest.GetWindowText(str); m_ListTem.SetItemText(m_Row, m_Col, str); //这里其实应该保存编辑结果,简化了,实际程序要有改变参数 m_EditTest.ShowWindow(SW_HIDE); }
现在可以编译运行并测试程序了,应该就是我们开头的结果。
改进
输入完数据后,一般希望回车,就生效,可实际情况是要离开才生效,有点操作不方便。
编辑框怎么相应回车呢?
类精灵CListCtrlTestDlg里转到 Virtual function,点击添加 PreTranslateMessage
编辑PreTranslateMessage函数如下:
BOOL CListCtrlTestDlg::PreTranslateMessage(MSG* pMsg) { if (WM_KEYDOWN ==pMsg->message && VK_RETURN == pMsg->wParam) { if (m_EditTest.IsWindowVisible()) { m_EditTest.ShowWindow(SW_HIDE); return TRUE; } } return CDialogEx::PreTranslateMessage(pMsg); }
这段代码的含义是:在按下回车键时, 如果编辑框是可见的,就让编辑框不显示。编辑框不显示就触发EN_KILLFOCUS消息。达到回车就保存的目的。
更多相关内容 -
ARM的列表框控件的使用
2020-08-11 18:54:03本讲主要介绍ARM的列表框控件的使用。 -
MFC可编辑列表框控件
2016-08-27 19:12:01扩展了MFC列表框控件功能,使得列表框控件中的值可以编辑 -
MB_两个列表框控件_对话框程序_实现按钮功能_
2021-09-29 04:19:29对话框程序,两个列表框控件,实现按钮功能 -
在Internet Explorer中向下拉列表和列表框控件添加工具提示
2021-04-07 23:34:37Internet Explorer并不总是显示下拉列表和列表框的全部内容。 这意味着,如果列表框中的数据大于控件的威力,则用户将无法完全看到它。 我们可以显示每个内容的工具提示来解决问题。 -
VS2019/MFC编程入门:列表框控件ListBox及其实例
2021-03-17 09:19:11本文要讲的是列表框控件(ListBox)及其使用实例。 Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、...前面两节讲了比较常用的按钮控件,并通过按钮控件实例说明了具体用法。本文要讲的是列表框控件(ListBox)及其使用实例。
Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
列表框控件简介
列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。
列表框也会向父窗口发送通知消息。这些通知消息及含义如下:
LBN_DBLCLK :用户用鼠标双击了一列表项,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_ERRSPACE :列表框不能申请足够的动态内存来满足需要
LBN_KILLFOCUS :列表框失去输入焦点
LBN_SELCANCEL: 当前的选择被取消,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_SELCHANGE:单击鼠标选择了一列表项,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_SETFOCUS:列表框获得输入焦点
WM_CHARTOITEM:当列表框收到WM_CHAR 消息后, 向父窗口发送该消息, 只有具有LBS_WANTKEYBOARDINPUT 风格的列表框才会发送该消息
WM_VKEYTOITEM:当列表框收到WM_KEYDOWN 消息后,向父窗口发送该消息,只有具有LBS_WANTKEYBOARDINPUT 风格的列表框才会发送该消息列表框控件的创建
MFC将列表框控件的所有操作都封装到了CListBox类中。
创建列表框控件时,可以在对话框模板中直接拖入列表框控件Listbox,然后添加控件变量使用。但如果需要动态创建列表框,就要用到CListBox类的Create成员函数了。Create成员函数的原型如下:
virtual BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
参数rect指定了列表框的位置和尺寸,pParentWnd为父窗口的指针,nID用于指定列表框控件的ID。最后重点讲讲参数dwStyle,它指定了列表框控件的风格,以下是各种风格说明:
LBS_EXTENDEDSEL:支持多重选择,在点击列表项时按住Shift 键或Ctrl 键即可选择多个项
LBS_HASSTRINGS:指定一个含有字符串的自绘式列表框
LBS_MULTICOLUMN:指定一个水平滚动的多列列表框, 通过调用CListBox::SetColumnWidth 来设置每列的宽度
LBS_MULTIPLESEL:支持多重选择。列表项的选择状态随着用户对该项单击或双击鼠标而翻转
LBS_NOINTEGRALHEIGHT:列表框的尺寸由应用程序而不是Windows 指定。通常,Windows指定尺寸会使列表项的某些部分隐藏起来
LBS_NOREDRAW:当选择发生变化时防止列表框被更新,可发送消息改变该风格
LBS_NOTIFY:当用户单击或双击鼠标时通知父窗口
LBS_OWNERDRAWFIXED:指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度
LBS_OWNERDRAWVARIABLE:指定自绘式列表框,并且列表项有不同的高度
LBS_SORT:使插入列表框中的项按升序排列
LBS_STANDARD:相当于指定了WS_BORDER|WS_VSCROLL|LBS_SORT
LBS_USETABSTOPS:使列表框在显示列表项时识别并扩展制表符(‘\t’),默认的制表宽度是32 个对话框单位
LBS_WANTKEYBOARDINPUT:允许列表框的父窗口接收WM_VKEYTOITEM 和WM_CHARTOITEM 消息,以响应键盘输入
LBS_DISABLENOSCROLL:使列表框在不需要滚动时显示一个禁止的垂直滚动条dwStyle可以是以上所列风格的组合。与其他控件一样,除了这些风格一般还要为列表框控件设置WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等风格。一般创建单选列表框时,风格要设置为:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD,如果不希望列表框项排序显示则应去掉LBS_STANDARD。创建多选列表框时,只需要在单选列表框风格后添加LBS_MULTIPLESEL或LBS_EXTENDEDSEL风格。
对于对话框模板中直接添加的列表框控件,其属性页中的属性包含了以上风格,例如属性Multicolumn对应的就是LBS_MULTICOLUMN风格。
CListBox类的主要成员函数
int GetCount( ) const;
返回值:返回列表框中列表项的数目,如果发生错误则返回LB_ERR。int GetSel(int nIndex) const;
参数:nIndex指定某个列表项的索引。
返回值:返回nIndex指定列表项的状态。如果此列表项被选择了则返回一个正值,否则返回0,若发生错误则返回LB_ERR。int SetSel(int nIndex,BOOL bSelect = TRUE);
此函数只用于多选列表框,使用它可以选择或取消选择指定的列表项。
参数:nIndex指定某个列表项的索引,若为-1则相当于指定了所有列表项。bSelect为TRUE时选择指定列表项,否则取消选择指定列表项。
返回值:如果发生错误则返回LB_ERR。int AddString(LPCTSTR lpszItem);
此函数用来向列表框中添加字符串。如果列表框指定了LBS_SORT风格,字符串就被以排序顺序插入到列表框中,如果没有指定LBS_SORT风格,字符串就被添加到列表框的结尾。
参数:lpszItem指定了要添加的字符串。
返回值:返回字符串在列表框中添加的位置。如果发生错误则返回LB_ERR,内存不够则返回LB_ERRSPACE。int InsertString(int nIndex, LPCTSTR lpszItem);
该函数用来在列表框中的指定位置插入字符串。与AddString函数不同的是,InsertString函数不会导致LBS_SORT风格的列表框重新排序。不要在具有LBS_SORT风格的列表框中使用InsertString函数,以免破坏列表项的次序。
参数:。参数nIndex 给出了插入位置(索引),如果值为-1,则字符串将被添加到列表的末尾。参数lpszItem 指定了要插入的字符串。
返回值:返回实际的插入位置,若发生错误,会返回LB_ERR 或LB_ERRSPACE。int DeleteString(UINT nIndex);
该函数用于删除指定的列表项。
参数:nIndex 指定了要删除项的索引。
返回值:函数的返回值为剩下的列表项数目,如果nIndex 超过了实际的表项总数,则返回LB_ERR。void ResetContent();
该函数用于清除所有列表项。int GetText(int nIndex,LPTSTR lpszBuffer) const;
void GetText(int nIndex,CString& rString) const;
这两个成员函数用于获取指定列表项的字符串。参数nIndex 指定了列表项的索引。参数lpszBuffer 指向一个接收字符串的缓冲区。引用参数rString 则指定了接收字符串的CString对象。第一个版本的函数会返回获得的字符串的长度,若出错,则返回LB_ERR;第二个版本的函数则不会。int GetTextLen(int nIndex) const;
该函数返回指定列表项的字符串的字节长度。
参数:nIndex 指定了列表项的索引。
返回值:若出错则返回LB_ERR。int GetCurSel() const;
该函数仅适用于单选列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则函数返回LB_ERR。int SetCurSel(int nSelect);
该函数仅适用于单选列表框,用来选择指定的列表项。该函数会滚动列表框以使选择项可见。参数nIndex 指定了列表项的索引,若为-1,那么将清除列表框中的选择。若出错函数返回LB_ERR。int GetSelCount() const;
该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR。int FindString(int nStartAfter,LPCTSTR lpszItem) const;
该函数用于对列表项进行与大小写无关的搜索。参数nStartAfter 指定了开始搜索的位置,合理指定nStartAfter 可以加快搜索速度,若nStartAfter 为-1,则从头开始搜索整个列表。参数lpszItem 指定了要搜索的字符串。函数返回与lpszItem 指定的字符串相匹配的列表项的索引,若没有找到匹配项或发生了错误,则会返回LB_ERR。FindString 函数先从nStartAfter指定的位置开始搜索,若没有找到匹配项,则会从头开始搜索列表。只有找到匹配项,或对整个列表搜索完一遍后,搜索过程才会停止,所以不必担心会漏掉要搜索的列表项。int SelectString(int nStartAfter,LPCTSTR lpszItem);
该函数仅适用于单选列表框,用来选择与指定字符串相匹配的列表项。该函数会滚动列表框以使选择项可见。参数的意义及搜索的方法与函数FindString 类似。如果找到了匹配的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR 并且当前的选择不被改变。CListBox类应用实例
最后鸡啄米给大家写一个简单的实例,说明CListBox的几个成员函数及通知消息等的使用方法。此实例实现的功能:在单选列表框中显示一个网站列表,然后在用鼠标左键选择某列表项时,将选中列表项的文本显示到编辑框中。下面是具体实现步骤:
1. 创建一个基于对话框的MFC工程,名称设置为“Example24”。
2. 在自动生成的对话框模板IDD_EXAMPLE24_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Listbox控件,ID设置为IDC_WEB_LIST,Sort属性设为False,以取消排序显示。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“您选择的站点:”,编辑框的ID设为IDC_SEL_WEB_EDIT,Read Only属性设为True。此时的对话框模板如下图:
3. 为列表框IDC_WEB_LIST添加CListBox类型的控件变量m_listBox。
4. 在对话框初始化时,我们将站点名加入到列表框中,那么需要修改CExample24Dlg::OnInitDialog()函数为:
C++代码
BOOL CExample24Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. 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); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_listBox.AddString(_T("新浪")); // 在列表框结尾添加字符串“新浪” m_listBox.AddString(_T("鸡啄米")); // 在列表框结尾添加字符串“鸡啄米” m_listBox.AddString(_T("猫扑")); // 在列表框结尾添加字符串“猫扑” m_listBox.InsertString(2, _T("百度")); // 在列表框中索引为2的位置插入字符串“百度” return TRUE; // return TRUE unless you set the focus to a control }
5. 我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到LBN_SELCHANGE通知消息。为列表框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息处理函数CExample24Dlg::OnLbnSelchangeWebList(),并修改如下:
C++代码
void CExample24Dlg::OnLbnSelchangeWebList() { // TODO: Add your control notification handler code here CString strText; int nCurSel; nCurSel = m_listBox.GetCurSel(); // 获取当前选中列表项 m_listBox.GetText(nCurSel, strText); // 获取选中列表项的字符串 SetDlgItemText(IDC_SEL_WEB_EDIT, strText); // 将选中列表项的字符串显示到编辑框中 }
6. 运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。效果图如下:
关于列表框ListBox的讲解就到此为止了。大家如果想试验更多的列表框成员函数,可以在上面的小例子中加入更多的功能来体会。最后依然感谢大家对鸡啄米的关注。
-
Android自定义下拉列表框控件源码
2015-04-14 15:18:03基于android 4.4 开发的 自定义android 下拉列表框控件 源码,有需要的欢迎下载哈 -
列表框控件的 插入 删除 替换
2015-10-21 20:32:21列表框控件的详细使用,删除。插入,查找替换 -
基于VS2015的MFC学习笔记(列表框控件ListBox)
2020-05-19 23:40:08列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以...列表框控件简介
列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。
列表框也会向父窗口发送通知消息。这些通知消息及含义如下:
LBN_DBLCLK :用户用鼠标双击了一列表项,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_ERRSPACE :列表框不能申请足够的动态内存来满足需要
LBN_KILLFOCUS :列表框失去输入焦点
LBN_SELCANCEL: 当前的选择被取消,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_SELCHANGE:单击鼠标选择了一列表项,只有具有LBS_NOTIFY 的列表框才能发送该消息
LBN_SETFOCUS:列表框获得输入焦点
WM_CHARTOITEM:当列表框收到WM_CHAR 消息后, 向父窗口发送该消息, 只有具有LBS_WANTKEYBOARDINPUT 风格的列表框才会发送该消息
WM_VKEYTOITEM:当列表框收到WM_KEYDOWN 消息后,向父窗口发送该消息,只有具有LBS_WANTKEYBOARDINPUT 风格的列表框才会发送该消息列表框控件的创建
MFC将列表框控件的所有操作都封装到了CListBox类中。创建列表框控件时,可以在对话框模板中直接拖入列表框控件Listbox,然后添加控件变量使用。但如果需要动态创建列表框,就要用到CListBox类的Create成员函数了。Create成员函数的原型如下:
virtual BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
参数rect指定了列表框的位置和尺寸,pParentWnd为父窗口的指针,nID用于指定列表框控件的ID。最后重点讲讲参数dwStyle,它指定了列表框控件的风格,以下是各种风格说明:
LBS_EXTENDEDSEL:支持多重选择,在点击列表项时按住Shift 键或Ctrl 键即可选择多个项
LBS_HASSTRINGS:指定一个含有字符串的自绘式列表框
LBS_MULTICOLUMN:指定一个水平滚动的多列列表框, 通过调用CListBox::SetColumnWidth 来设置每列的宽度
LBS_MULTIPLESEL:支持多重选择。列表项的选择状态随着用户对该项单击或双击鼠标而翻转
LBS_NOINTEGRALHEIGHT:列表框的尺寸由应用程序而不是Windows 指定。通常,Windows指定尺寸会使列表项的某些部分隐藏起来
LBS_NOREDRAW:当选择发生变化时防止列表框被更新,可发送消息改变该风格
LBS_NOTIFY:当用户单击或双击鼠标时通知父窗口
LBS_OWNERDRAWFIXED:指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度
LBS_OWNERDRAWVARIABLE:指定自绘式列表框,并且列表项有不同的高度
LBS_SORT:使插入列表框中的项按升序排列
LBS_STANDARD:相当于指定了WS_BORDER|WS_VSCROLL|LBS_SORT
LBS_USETABSTOPS:使列表框在显示列表项时识别并扩展制表符(‘\t’),默认的制表宽度是32 个对话框单位
LBS_WANTKEYBOARDINPUT:允许列表框的父窗口接收WM_VKEYTOITEM 和WM_CHARTOITEM 消息,以响应键盘输入
LBS_DISABLENOSCROLL:使列表框在不需要滚动时显示一个禁止的垂直滚动条dwStyle可以是以上所列风格的组合。与其他控件一样,除了这些风格一般还要为列表框控件设置WS_CHILD、WS_VISIBLE、WS_TABSTOP、WS_BORDER、WS_VSCROLL等风格。一般创建单选列表框时,风格要设置为:WS_CHILD|WS_VISIBLE|WS_TABSTOP|LBS_STANDARD,如果不希望列表框项排序显示则应去掉LBS_STANDARD。创建多选列表框时,只需要在单选列表框风格后添加LBS_MULTIPLESEL或LBS_EXTENDEDSEL风格。
对于对话框模板中直接添加的列表框控件,其属性页中的属性包含了以上风格,例如属性Multicolumn对应的就是LBS_MULTICOLUMN风格。CListBox类的主要成员函数
int GetCount( ) const;
返回值:返回列表框中列表项的数目,如果发生错误则返回LB_ERR。
int GetSel(int nIndex) const;
参数:nIndex指定某个列表项的索引。
返回值:返回nIndex指定列表项的状态。如果此列表项被选择了则返回一个正值,否则返回0,若发生错误则返回LB_ERR。
int SetSel(int nIndex,BOOL bSelect = TRUE);
此函数只用于多选列表框,使用它可以选择或取消选择指定的列表项。
参数:nIndex指定某个列表项的索引,若为-1则相当于指定了所有列表项。bSelect为TRUE时选择指定列表项,否则取消选择指定列表项。
返回值:如果发生错误则返回LB_ERR。
int AddString(LPCTSTR lpszItem);
此函数用来向列表框中添加字符串。如果列表框指定了LBS_SORT风格,字符串就被以排序顺序插入到列表框中,如果没有指定LBS_SORT风格,字符串就被添加到列表框的结尾。
参数:lpszItem指定了要添加的字符串。
返回值:返回字符串在列表框中添加的位置。如果发生错误则返回LB_ERR,内存不够则返回LB_ERRSPACE。
int InsertString(int nIndex, LPCTSTR lpszItem);
该函数用来在列表框中的指定位置插入字符串。与AddString函数不同的是,InsertString函数不会导致LBS_SORT风格的列表框重新排序。不要在具有LBS_SORT风格的列表框中使用InsertString函数,以免破坏列表项的次序。
参数nIndex 给出了插入位置(索引),如果值为-1,则字符串将被添加到列表的末尾。参数lpszItem 指定了要插入的字符串。
返回值:返回实际的插入位置,若发生错误,会返回LB_ERR 或LB_ERRSPACE。
int DeleteString(UINT nIndex);
该函数用于删除指定的列表项。
参数:nIndex 指定了要删除项的索引。
返回值:函数的返回值为剩下的列表项数目,如果nIndex 超过了实际的表项总数,则返回LB_ERR。
void ResetContent();
该函数用于清除所有列表项。
int GetText(int nIndex,LPTSTR lpszBuffer) const;
void GetText(int nIndex,CString& rString) const;
这两个成员函数用于获取指定列表项的字符串。参数nIndex 指定了列表项的索引。参数lpszBuffer 指向一个接收字符串的缓冲区。引用参数rString 则指定了接收字符串的CString对象。第一个版本的函数会返回获得的字符串的长度,若出错,则返回LB_ERR;第二个版本的函数则不会。
int GetTextLen(int nIndex) const;
该函数返回指定列表项的字符串的字节长度。
参数:nIndex 指定了列表项的索引。
返回值:若出错则返回LB_ERR。
int GetCurSel() const;
该函数仅适用于单选列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则函数返回LB_ERR。
int SetCurSel(int nSelect);
该函数仅适用于单选列表框,用来选择指定的列表项。该函数会滚动列表框以使选择项可见。参数nIndex 指定了列表项的索引,若为-1,那么将清除列表框中的选择。若出错函数返回LB_ERR。
int GetSelCount() const;
该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR。
int FindString(int nStartAfter,LPCTSTR lpszItem) const;
该函数用于对列表项进行与大小写无关的搜索。参数nStartAfter 指定了开始搜索的位置,合理指定nStartAfter 可以加快搜索速度,若nStartAfter 为-1,则从头开始搜索整个列表。参数lpszItem 指定了要搜索的字符串。函数返回与lpszItem 指定的字符串相匹配的列表项的索引,若没有找到匹配项或发生了错误,则会返回LB_ERR。FindString 函数先从nStartAfter指定的位置开始搜索,若没有找到匹配项,则会从头开始搜索列表。只有找到匹配项,或对整个列表搜索完一遍后,搜索过程才会停止,所以不必担心会漏掉要搜索的列表项。
int SelectString(int nStartAfter,LPCTSTR lpszItem);
该函数仅适用于单选列表框,用来选择与指定字符串相匹配的列表项。该函数会滚动列表框以使选择项可见。参数的意义及搜索的方法与函数FindString 类似。如果找到了匹配的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR 并且当前的选择不被改变。CListBox类应用实例
此实例实现的功能:在单选列表框中显示一个网站列表,然后在用鼠标左键选择某列表项时,将选中列表项的文本显示到编辑框中。下面是具体实现步骤:
- 创建一个基于对话框的MFC工程,名称设置为“Example”。
- 在自动生成的对话框模板IDD_EXAMPLE_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Listbox控件,ID设置为IDC_WEB_LIST,Sort属性设为False,以取消排序显示。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“您选择的站点:”,编辑框的ID设为IDC_SEL_WEB_EDIT,Read Only属性设为True。此时的对话框模板如下图:
- 为列表框IDC_WEB_LIST添加CListBox类型的控件变量m_listBox。
4.在对话框初始化时,我们将站点名加入到列表框中,那么需要修改CExampleDlg::OnInitDialog()函数为:
BOOL CexampleDlg::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("CSDN")); // 在列表框结尾添加字符串“CSDN” m_listBox.AddString(_T("猫扑")); // 在列表框结尾添加字符串“猫扑” m_listBox.InsertString(2, _T("百度")); // 在列表框中索引为2的位置插入字符串“百度” return TRUE; // 除非将焦点设置到控件,否则返回 TRUE }
- 我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到LBN_SELCHANGE通知消息。为列表框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息处理函数CexampleDlg::OnLbnSelchangeWebList(),并修改如下:
void CexampleDlg::OnLbnSelchangeWebList() { // TODO: 在此添加控件通知处理程序代码 CString strText; int nCurSel; nCurSel = m_listBox.GetCurSel(); // 获取当前选中列表项 m_listBox.GetText(nCurSel, strText); // 获取选中列表项的字符串 SetDlgItemText(IDC_SEL_WEB_EDIT, strText); // 将选中列表项的字符串显示到编辑框中 }
- 运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。效果图如下:
大家如果想试验更多的列表框成员函数,可以在上面的小例子中加入更多的功能来体会。
-
列表框控件(CListBox)和列表控件(CListCt...
2014-08-15 10:46:44列表框控件(CListBox)和列表控件的最全详细介绍。这个文档基本可以解决以上两控件相关的各种问题 -
VB版Picasa风格漂亮的列表框控件
2021-05-12 20:20:28内容索引:VB源码,界面编程,列表框,控件 谷歌Picasa照片处理软件风格的列表框控件,用于Picasa的朋友或许就会知道,它的界面非常漂亮,现在这款控件,模仿的就是这种界面的一部分,一个列表框控件,其实更像是一个... -
WPF实现带全选复选框的列表控件
2020-10-19 15:55:47主要为大家详细介绍了WPF实现带全选复选框的列表控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
从文件中读取内容在列表框控件中显示
2010-09-10 16:35:10vc++ 列表框控件的典型应用,从文件中读取并显示 -
C#使用多选列表框控件
2012-04-17 19:15:20C#使用多选列表框控件 -
C# 实现WinForm带复选框的下拉列表DLL控件
2021-03-16 00:15:55C# 实现WinForm带复选框的下拉列表DLL控件,ComboBox WinForm应用,是一个DLL的源码,实现窗口中带复选框的下拉列表,源码编译后生成UCComboBox.dll,你在项目中添加引用就可使用了。 运行环境:Visual Studio2010 -
Delphi为TEdit控件添加列表选择框
2021-05-11 14:31:01Delphi为TEdit控件添加列表选择框,Delphi基础知识例子,在一个供录入的表单中,添加一个下拉框,让用户通过选择下拉框的内容完成输入,可提升软件操作体验,下拉列表框中的数据还可以从数据库读取出来显示。... -
列表框控件的使用
2011-10-09 18:46:57本实例是对列表框控件的使用,希望大家能够通过该实例学习到有关的知识点。 -
C# ListBox:列表框控件
2019-06-11 22:26:10列表框 (ListBox) 将所提供的内容以列表的形式显示出来, 并可以选择其中的一项或多项内容,从形式上比使用复选框更好一些。 列表框中常用属性: 列表框还提供了一些方法来操作列表框中的选项,由于列表框中的...列表框 (ListBox) 将所提供的内容以列表的形式显示出来,
并可以选择其中的一项或多项内容,从形式上比使用复选框更好一些。
列表框中常用属性:
列表框还提供了一些方法来操作列表框中的选项,由于列表框中的选项是一个集合形式的,
列表项的操作都是用 Items 属性进行的。
例如Items.Add
方法用于向列表框中添加项,Items.Insert
方法用于向列表框中的指定位置添加项,Items.Remove
方法用于移除列表框中的项。注意事项:
ListBox实现多选需要设置窗体的 SelectionMode 属性为 MultiSimple。
SelectionMode如想选择MultiSimple选项,必须将MultiColumn选项设置为true
【实例 1】
使用列表框的形式完成爱好的选择。
添加和删除爱好
ListBox.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class ListBox : Form { public ListBox() { InitializeComponent(); } /* *将列表框中的选中项删除 *在编写删除操作的功能时需要注意,首先要将列表框中的选中项存放到一个集合中, *然后再对该集合中的元素依次使用 Remove 方法移除 */ private void button2_Click(object sender, EventArgs e) { //由于列表框控件中允许多选所以需要循环删除所有已选项 int count = listBox1.SelectedItems.Count; List<string> itemValues = new List<string>(); if (count != 0) { for (int i = 0; i < count; i++) { itemValues.Add(listBox1.SelectedItems[i].ToString()); } foreach (string item in itemValues) { listBox1.Items.Remove(item); MessageBox.Show("删除成功!","提示"); } } else { MessageBox.Show("请选择需要删除的爱好!"); } } //将文本框中的值添加到列表框中 private void button3_Click(object sender, EventArgs e) { //当文本框中的值不为空时将其添加到列表框中 if (textBox1.Text != "") { listBox1.Items.Add(textBox1.Text); MessageBox.Show("添加成功!","提示"); } else { MessageBox.Show("请添加爱好!"); } } private void button1_Click(object sender, EventArgs e) { //单击“确定”按钮事件 string msg = ""; for (int i = 0; i < listBox1.SelectedItems.Count; i++) { msg = msg + " " + listBox1.SelectedItems[i].ToString(); } if (msg != "") { MessageBox.Show("您选择的爱好是:" + msg, "提示"); } else { MessageBox.Show("您没有选择爱好", "提示"); } } } }
Pragram.cs
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new ListBox()); } } }
-
DUILIB列表框扩展控件
2016-05-21 13:58:10DUILIB列表框控件的扩展样式,基于网上源码修改,能够透明悬浮,自定义列表表头、颜色、子窗口属性。 -
VC6.0 MFC 列表框 列表控件 添加 修改 删除
2020-06-28 15:46:24VC6.0 MFC 列表框 列表控件 添加 修改 删除 写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧! 一、未卜先知 1、编译运行后,点击“学生档案信息”,界面如下图所示... -
常用控件:列表框控件ListBox
2017-09-29 10:10:18列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以... -
VS2013/MFC编程入门之二十三(常用控件:列表框控件ListBox)
2016-12-01 18:30:59本文要讲的是列表框控件(ListBox)及其使用实例。 列表框控件简介 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,... -
WPS表格怎么使用列表框控件?
2021-01-13 16:52:38wps表格中想要制作一个列表框,该怎么制作呢?需要使用列表框空间,该怎么...3、然后,鼠标左键,把列表框控件拖放到表格的单元格中,如下图所示。4、接着,鼠标左键选择列表框控件,并单击右键菜单中【列表框对象】... -
VS2015对MFC中列表框的使用
2020-04-26 17:47:00用VS2015实现mfc中基本控件列表框的使用,该程序功能可以进行对列表框内容的增加和减少,并进行相应的判断。 -
labview列表框滚动实时显示
2017-08-21 20:37:46labview状态显示窗口专用,采用列表框,可以动态的滚动显示信息,内含注解! -
YCombo VB列表框控件源码
2012-08-09 11:51:38摘要:VB源码,界面编程,列表框控件 YCombo VB列表框控件源码,想一步步摆脱系统控件,这是一个初步的尝试,关于内部的一个事件声明: Public Event Change() 这个过程必须放在用户控件的最顶部 要隐藏这个... -
VB中防止将重复项目添加到列表框控件中...
2009-10-08 01:56:41VB 之 精 彩 编 程-VB中防止将重复项目添加到列表框控件中 -
VC++在ListView列表控件中使用复选框
2021-03-15 18:50:28内容索引:VC/C++源码,报表打印,复选框,列表控件 VC++在ListView列表控件中使用复选框,每一行都可以有一个复选框,有效扩展列表控件的功能,复选框与列表结合,也是比较经典的一种组合方式。