精华内容
下载资源
问答
  • MFC列表框控件的动态编辑

    千次阅读 2019-09-10 13:14:41
    在我们进行mfc 编程时,我们需要用到列表框显示各层或各物体的参数设置,同时也...最近看到一个文章https://blog.csdn.net/qingyang8513/article/details/50986455,这个直接用 listctrl 和 一个Edit 控件,很简单...

    在我们进行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消息。达到回车就保存的目的。

     

     

    展开全文
  • 常用控件:列表框控件ListBox

    千次阅读 2017-09-29 10:10:18
    列表框控件简介  列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以...

    列表框控件简介

      列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。

      列表框也会向父窗口发送通知消息。这些通知消息含义如下:

      LBN_DBLCLK:用户用鼠标双击了一列表项,只有具有LBS_NOTIFY的列表才能发送该消息。

      LBN_ERRSPACE:列表框不能申请足够的动态内存来满足需要。

      LBN_KILLFOCUS:列表框失去焦点。

      LBN_SELCANCEL:当前的选择被取消,只有具有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_MULTICOLUMN:指定一个水平滚动的多列列表框,通过调用CListBox::SetColumnWidth来设置每列的宽度。

      LBS_MULTIPLESEL:支持多重选择。列表项的选择状态随着用户对该项单机或双击鼠标而翻转。

      LBS_NOINTEGRALHEIGHT:列表框的尺寸由应用程序而不是Windows指定。通常,Windows指定尺寸会使列表项的某些部分隐藏起来。

      LBS_NOREDRAW:当选择发生变化时防止列表框被更新,可发送消息改变改变该风格。

      LBS_NOTIFY:当用户单击或双击鼠标时通知父窗口。

      LBS_OWNERDRAWFIXED:指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项具有相同的高度。

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

      LBS_STANDARD:相当于指定了WS_BORDER|WS_VSCROLL|LBS_SORT。

      LBS_USETABSTOPS:使列表框在显示列表项时识别并扩展制表符('\t'),默认的制表宽度是32个对话框单位。

      LBS_WANTKEYBOARDINPUT:允许列表框的父窗口接收WM_VKEYTOITEM和WM_CHARTOITEM消息,以响应键盘输入。

      LBS_DISABLEENOSCROLL:使列表框在不需要滚动时显示一个禁止的垂直滚动条。

      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, LPCTSTR 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工程,名称设置为”MFCListBoxDemo“。

      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。此时的对话框模板如下图:

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

      4、在对话框初始化时,我们将站点名加入到列表框,那么需要修改CMFCListBoxDemoDlg::OnInitDialog()函数为:

    C++代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    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添加消息处理函数CMFCListBoxDemoDlg::OnLbnSelchangeWebList(),并修改如下:

    C++代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void  CMFCListBoxDemoDlg::OnLbnSelchangeWebList()
    {
         // TODO: 在此添加控件通知处理程序代码
         CString strText;
         int  nCurSel;
     
         nCurSel = m_listBox.GetCurSel();     // 获取当前选中列表项
         m_listBox.GetText(nCurSel, strText);     // 获取选中列表项的字符串
         SetDlgItemText(IDC_SEL_WEB_EDIT, strText);   //将选中列表项的字符串显示到编辑框中
    }

      6、运行程序,弹出结果对话框,在对话框的列表中用鼠标改变选中项时,编辑框的显示会相应改变。效果图如下:

      关于列表框ListBox的讲解就到此为止了。如果大家想试验更多的列表框成员函数,可以在上面的小例子中加入更多的更能来体会。

    展开全文
  • 非常值得收藏,下载的源码资源: 1. 代码源自网络,并添加部分示例代码; 2. 自定义Combobx下拉框,支持基础控件下拉,也支持自定义控件下拉,扩展十分方便;
  • DUILIB列表框扩展控件

    2016-05-21 13:58:10
    DUILIB列表框控件的扩展样式,基于网上源码修改,能够透明悬浮,自定义列表表头、颜色、子窗口属性。
  • 列表框控件简介

    千次阅读 2015-09-29 11:26:36
    列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。  列表框也会向父窗口发送通知消息。这些通知消息及含义如下:  LBN_DBLCLK :...

    列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时选择多个列表项。

           列表框也会向父窗口发送通知消息。这些通知消息及含义如下:

           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。此时的对话框模板如下图:

    VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)

           3. 为列表框IDC_WEB_LIST添加CListBox类型的控件变量m_listBox。

           4. 在对话框初始化时,我们将站点名加入到列表框中,那么需要修改CExample24Dlg::OnInitDialog()函数为:

    C++代码
    1. BOOL CExample24Dlg::OnInitDialog()   
    2. {   
    3.     CDialogEx::OnInitDialog();   
    4.   
    5.     // Add "About..." menu item to system menu.   
    6.   
    7.     // IDM_ABOUTBOX must be in the system command range.   
    8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
    9.     ASSERT(IDM_ABOUTBOX < 0xF000);   
    10.   
    11.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
    12.     if (pSysMenu != NULL)   
    13.     {   
    14.         BOOL bNameValid;   
    15.         CString strAboutMenu;   
    16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
    17.         ASSERT(bNameValid);   
    18.         if (!strAboutMenu.IsEmpty())   
    19.         {   
    20.             pSysMenu->AppendMenu(MF_SEPARATOR);   
    21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
    22.         }   
    23.     }   
    24.   
    25.     // Set the icon for this dialog.  The framework does this automatically   
    26.     //  when the application's main window is not a dialog   
    27.     SetIcon(m_hIcon, TRUE);         // Set big icon   
    28.     SetIcon(m_hIcon, FALSE);        // Set small icon   
    29.   
    30.     // TODO: Add extra initialization here   
    31.     m_listBox.AddString(_T("新浪"));        // 在列表框结尾添加字符串“新浪”   
    32.     m_listBox.AddString(_T("鸡啄米"));      // 在列表框结尾添加字符串“鸡啄米”   
    33.     m_listBox.AddString(_T("猫扑"));        // 在列表框结尾添加字符串“猫扑”   
    34.     m_listBox.InsertString(2, _T("百度"));  // 在列表框中索引为2的位置插入字符串“百度”   
    35.   
    36.     return TRUE;  // return TRUE  unless you set the focus to a control   
    37. }  

           5. 我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到LBN_SELCHANGE通知消息。为列表框IDC_WEB_LIST的通知消息LBN_SELCHANGE添加消息处理函数CExample24Dlg::OnLbnSelchangeWebList(),并修改如下:

    C++代码
    1. void CExample24Dlg::OnLbnSelchangeWebList()   
    2. {   
    3.     // TODO: Add your control notification handler code here   
    4.     CString strText;   
    5.     int nCurSel;   
    6.        
    7.     nCurSel = m_listBox.GetCurSel();           // 获取当前选中列表项   
    8.     m_listBox.GetText(nCurSel, strText);       // 获取选中列表项的字符串   
    9.     SetDlgItemText(IDC_SEL_WEB_EDIT, strText); // 将选中列表项的字符串显示到编辑框中   
    10. }  

           6. 运行程序,弹出结果对话框,在对话框的列表框中用鼠标改变选中项时,编辑框中的显示会相应改变。效果图如下:

    VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)

           关于列表框ListBox的讲解就到此为止了。大家如果想试验更多的列表框成员函数,可以在上面的小例子中加入更多的功能来体会。最后依然感谢大家对鸡啄米的关注。

    展开全文
  • 本文将说明如何创建一个带全选复选列表控件。其效果如下图: 这个控件是由一个复选(CheckBox)与一个 ListView 组合而成。它的操作逻辑: 当选中“全选”时,列表中所有的项目都会被选中;反之,取消选中...
  • MFC实例:[5] ListBox 列表框控件实例

    千次阅读 2019-04-01 17:39:52
    MFC实例:[4] ListBox 列表框控件实例

    MFC实例:[4] ListBox 列表框控件实例

    1、打开vs2017------》文件-------》新建------》项目(MFC应用程序),创建好目录如下:

    2、打开资源文,双击MFCListBox.rc,显示如图:

    3、在自动生成的对话框模板中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Listbox控件,ID设置为IDC_YUYAN_LIST。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“选中的语言:”,编辑框的ID设为IDC_SEL_YUYAN_EDIT,Read Only属性设为True。此时的对话框模板如下图

    4、选中列表框,右键单机添加变量,为列表框IDC_YUYAN_LIST添加变量m_ListBox。

    5、初始化面板,增加代码

    // TODO: 在此添加额外的初始化代码
    	m_ListBox.AddString(_T("C/C++"));        // 在列表框结尾添加字符串   
    	m_ListBox.AddString(_T("python"));       
    	m_ListBox.AddString(_T("php"));          
    	m_ListBox.InsertString(2, _T("Java"));  

    6、我们希望在选中列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到LBN_SELCHANGE通知消息。选中ListBox控件,右键单击--》添加事件处理程序---》添加编辑---》调到代码界面

    7、继续添加事件处理代码:

    void CMFCListBoxDlg::OnLbnSelchangeYuyanList()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CString strText;
    	int nCurSel;
    
    	nCurSel = m_ListBox.GetCurSel();           // 获取当前选中列表项   
    	m_ListBox.GetText(nCurSel, strText);       // 获取选中列表项的字符串   
    	SetDlgItemText(IDC_SEL_YUYAN_EDIT, strText); // 将选中列表项的字符串显示到编辑框中   
    
    }

    8、运行如下图:

    9、工程下载地址:

    链接:https://pan.baidu.com/s/1rP_3wZ29qqCPGXg1cAC8Ww 
    提取码:sv56 

    展开全文
  • 列表框控件(listbox)消息

    千次阅读 2017-03-15 10:21:37
    列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示... 应用程序用CreateWindowEx创建列表框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(style)。  常
  • 易语言超级列表框添加组件源码,超级列表框添加组件,处理,重画控件,被单击,创建进度条,设置进度条,画出进度条,绘制进度条,CallWindowProcA,SetWindowLongA,GetScrollRange,GetScrollPos,删除目标,放弃环境,取环境,取...
  • LabVIEW(十六):多列列表框控件

    千次阅读 2018-09-25 08:51:00
    1、多列列表框控件:前面板右键>列表、表格和树>多列列表框 2、默认情况下只显示列首,可设置显示行首:前面板选中多列列表框右键>显示>行首 3、LabVIEW中提供42种自带的图标。 (1)、前面板选中多列列表框右键>...
  • 列表框控件(listbox)

    2010-05-06 18:22:00
    列表框(listbox)主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的...对于列表项的选择, 应用程序用CreateWindowEx创建列表框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(st
  • Android中的Spinner列表选择框,就是平时常见的下拉列表框,通常用于提供系列的可选择的列表项,供用户进行选择,方便用户输入。具体效果如图1所示。 图1 Spinner下拉列表中的列表项数据,可以来自于资源数组,...
  • 列表框控件简介   列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以...
  • 从通用CWin逐步创建自定义ListBox控件
  • 本文要讲的是列表框控件(ListBox)及其使用实例。  列表框控件简介  列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,...
  • 列表框(ListBox)用来显示一组相关联的数据,用户可以从中选择一个或多个选项。ListBox中的数据既可以在设计时填充,也可以在程序运行填充。列表框(ListBox)中的每个元素称为“项”。 列表框用于显示一组字符串...
  • MFC(创建列表--列表框形式

    千次阅读 2016-05-27 13:55:52
    1.在MFC控件中选择列表控件,放在合适位置。 2.在列表控件右键,选择属性。 3.在属性中,设置ID为IDC_LIST。 4.建立类向导: 1)在列表控件右键,选择建立类向导。 2)在类向导-Member Variables中选择IDC_LIST...
  • 创建具有复选的树型控件案例源码
  • 声明:由于自己的编程需要,这里的列表控件只有一列,是list样式。...2.定义一个int型的变量,就是指示在列表控件中哪个位置添加复选,并且在源文件的构造函数中初始化为0; int i_indexTvParent;//头文件声明i_i
  • MFC之列表框控件ListBox

    千次阅读 2015-09-01 14:55:42
    列表框控件简介  列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中一次只能选择一个列表项,而多选列表框可以同时...
  • 本文要讲的是列表框控件(ListBox)及其使用实例。  列表框控件简介  列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。列表框可分为单选列表框和多选列表框,顾名思义,...
  • 列表框双击自动添加,显示编辑框实现动态修改 1、List Control控件NM_DCLICK消息响应事件; 2、Edit Control的KillFocus消息响应; 3、Edit Control的动态显示及隐藏; 4、List Control获取指定行和列的编号,并获取...
  • MFC控件listbox(列表框

    千次阅读 2014-11-14 10:06:54
    假定已经创建一个Dialog,并且给该Dialog建立了类,并且从控件工具箱将 Combo Box 控件拖放到上面。打开 Class Wizard,添加控件对应变量,如:CComboBox m_cbExamble;在后面的代码中会不断使用这个变量。 建立...
  • MFC下拉列表框(Combox)控件使用方法

    万次阅读 2015-05-21 15:39:51
    Combo Box (组合)控件很简单,可以节省空间。从用户角度来看,这个控件是由一个文本输入控件一个下拉菜单组成的。用户可以从一个预先定义的...假定已经创建一个Dialog,并且从控件工具箱将 Combo Box 控件拖放
  • void Ckongjian22Dlg::OnBnClickedOk() { CString text; //得到文本框对像 CEdit * edit=(CEdit*)GetDlgItem(IDC_EDIT1); edit->GetWindowText(text);... //将文本框添加到列表框中 CList...
  • MFC中创建列表框&&及添加表格的方法

    千次阅读 2016-01-02 10:33:29
    步:向界面中添加“列表框控件”,用鼠标拖进来   第二步:设置列表框的属性,在样式中,选择“报告“----默认情况下是图标,这样是不会显示表格的,所以这里需要选择报告形式 第三步:创建列表框的...
  • 在VBA编写的程序中,如果可以在运行时动态创建控件无疑是非常有用的,因为有些控件是无法预先得知的,这样就更必须在运行时动态创建然后设置相应控件...Forms.Listbox.1(列表框) Forms.Commandbutton.1(命令按钮)
  • 导出列表框控件(List Control)的数据到EXCEL文件 上篇 今天的目标: 1、收集数据到列表框控件 2、列表框控件的数据导出到EXCEL文件(.xls) 开始: 今天的代码文件Github的链接我也会放在博客的底部哟 偷懒,我...
  • 列表框和组合框 列表框是CListBox类的对象,组合框是CComboBox的对象。 列表框 属性设置 列表框的重要属性有: Selection 该属性决定用户的选择方式,缺省值为 Single 。属性值有: ①:Single ── 单项...
  • 标准控件演示之三:列表框、组合框控件创建与使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,124
精华内容 40,049
热门标签
关键字:

创建一个列表框控件