06. 基本控件(下)

基本控件(下)

列表框控件

  • list box
  • 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。
  • 列表框可分为:
    1. 单选列表框:一次只能选择一个列表框。
    2. 多选列表框:可以同时选择多个列表框。

列表框示例

  1. 创建一个mfc的基于对话框工程。

  2. 在资源视图中,找到对话框,在对话框界面上点击右键,修改属性。

  3. 然后在工具箱里面,找到“list box”,拖动一个列表框到主对话框的面板。

  4. 再在工具箱里面,拖动一个“Group Box”,把刚刚的"list Box"包围起来。然后把“Group Box”的 caption修改为:“世界著名IT公司”。

  5. 修改ID,添加变量。

  6. 接下来是初始化这个控件。

    //在列表的指定位置插入一项字符串
    m_ListBox.InsertString(0, _T("微软公司"));//索引,字符串
    m_ListBox.InsertString(0,_T("C语言"));//在某个位置插入字符串
    //m_ListBox.AddString(_T("C++"));//尾插,但是索引不明确,因此不建议使用
    
  7. 继续添加。

    m_ListBox.InsertString(0,_T("C语言"));//在某个位置插入字符串
    //m_ListBox.AddString(_T("C++"));//尾插,但是索引不明确,因此不建议使用
    m_ListBox.InsertString(1, _T("C++"));
    m_ListBox.InsertString(2, _T("数据结构"));
    m_ListBox.InsertString(3, _T("win32"));
    m_ListBox.InsertString(4, _T("数据库"));
    m_ListBox.InsertString(5, _T("Qt"));
    
    
  8. 如需要把这些字符串取出来,就是鼠标点中某个字符串,就要得到该字符串。 为“list box”控件。生成一个消息处理函数。

  9. 在该函数中书写代码:

    void Cclass06Dlg::OnBnClickedButton1()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	int index = m_ListBox.GetCurSel();//获取目前所选的基于0的下标
    	CString str;
    	if (index != -1) {//如果没获取到下标(未选中任何值),GetCurSel()会返回-1
            m_ListBox.GetText(index,str);//将index下的内容放入CString的变量中
            MessageBox(str,L"提示",0);
    	}
    }
    

组合框控件

  • combo box

  • 组合框其实就是把一个编辑框和一个列表框组合到了一起。

  • 分为三种:

    1. 简易(simple)组合框 :不可展开
    2. 下拉式(dropdown)组合框 : 可展开可编辑的组合框
    3. 下拉列表式(drop list)组合框 : 可展开不可编辑的组合框

组合框示例

  1. 拖入一个”静态文本“,取名为:”你的毕业学校:“。然后再拖入一个”combo box“,修改该”combo box“的id。

  2. 为”combo box“这个控件添加变量。

  3. 给这个控件去做一些初始化,提供一些字符串,给用户去选择。(和列表框一样)

    m_combo.InsertString(0, _T("C语言"));//在某个位置插入字符串
    //m_combo.AddString(_T("C++"));//尾插,但是索引不明确,因此不建议使用
    m_combo.InsertString(1, _T("C++"));
    m_combo.InsertString(2, _T("数据结构"));
    m_combo.InsertString(3, _T("win32"));
    m_combo.InsertString(4, _T("数据库"));
    m_combo.InsertString(5, _T("Qt"));
    
  4. 如想设置默认值,可以在初始化后面加上一句

    m_combo.SetCurSel(0);//设置下标为0对应的是默认的字符串
    
  5. 想得到用户的选择,生成"Combo box"控件处理函数。(和列表框相似)

    void Cclass06Dlg::OnBnClickedButton2()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	int index = m_combo.GetCurSel();//获取目前所选的基于0的下标
    	CString str;
    	if (index != -1) {
    		m_combo.GetLBText(index, str);//将index下的内容放入CString的变量中,与列表框有些差异
    		MessageBox(str, L"提示", 0);
    	}
    }
    
  6. 接下来,一个光标资源(.cur)文件导入。

  7. 为消息”WM_SETCURSOR“添加处理函数:

    //加载资源中的.cur光标
    HCURSOR hCursor = LoadCursor(AfxGetApp()->m_hInstance,
    MAKEINTRESOURCE(IDC_CURSOR1));
    ::SetCursor(hCursor);
    return true;//一定要注释掉系统写的,否则将不会被改变
    //return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
    

列表视图控件

  • list control
  • 列表视图控件,能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁、直观。在实现应用中能为用户带来方便。
  • 该控件是对前面讲到的列表框控件"list box"的改进和延伸。
  • 列表视图控件的列表项一般有图标(icon)和标签(label)两部分。
  • 图标是对列表项图形描述。标签是文字描述。
  • 当然列表项可以只包含图标或只包含标签。

列表视图控件示例

  1. 拖入一个”list control“控件。修改 属性 -> 视图 ”View“为”report“(report报表最常用,),修改ID。 第0列只能设置左对齐或者右对齐,之后的才可以主动调整

  2. 拖入一个”静态文本“,修改名字:”你想了解的大学:“。拖入”edit control“,来用显示用户在list control中选择后的字符串。修改ID

  3. 进行初始化,在初始化之前,先给这个控件绑定一个变量。

  4. 在初始化函数中加上代码:

    m_ListInfo.SetExtendedStyle(m_ListInfo.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    CRect rect;//用来获取窗口大小
    m_ListInfo.GetClientRect(&rect);
    m_ListInfo.InsertColumn(0, L"排名", LVCFMT_CENTER, rect.Width() / 3, 0);
    m_ListInfo.InsertColumn(1, L"名称", LVCFMT_CENTER, rect.Width() / 3, 0);
    m_ListInfo.InsertColumn(2, L"国家", LVCFMT_CENTER, rect.Width() / 3, 0);
    
    
    m_ListInfo.InsertItem(0, _T("1"));
    m_ListInfo.SetItemText(0, 1, _T("哈佛大学"));//主项的第几项,第几个描述,内容
    m_ListInfo.SetItemText(0, 2, _T("美国"));//主项的第几项,第几个描述,内容
    m_ListInfo.InsertItem(1, _T("2"));
    m_ListInfo.SetItemText(1, 1, _T("清华"));
    m_ListInfo.SetItemText(1, 2, _T("中国"));
    m_ListInfo.InsertItem(2, _T("3"));
    m_ListInfo.SetItemText(2, 1, _T("北大"));
    m_ListInfo.SetItemText(2, 2, _T("中国"));
    m_ListInfo.InsertItem(3, _T("4"));
    m_ListInfo.SetItemText(3, 1, _T("剑桥"));
    m_ListInfo.SetItemText(3, 2, _T("英国"));
    m_ListInfo.InsertItem(4, _T("5"));
    m_ListInfo.SetItemText(4, 1, _T("复旦"));
    m_ListInfo.SetItemText(4, 2, _T("中国"));
    
  5. 当用户用鼠标点击某一条时,需要把这条的数据字符串显示到下方的"IDC_STATIC1"上面。所以给”list control“添加事件处理函数:

    void Cclass06Dlg::OnLvnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult)
    {
    	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    	// TODO: 在此添加控件通知处理程序代码
    	CString str;
    	if (-1 != pNMLV->iItem) {
    		str = L"排名:";
    		str += m_ListInfo.GetItemText(pNMLV->iItem, 0);
    		str += L"    学校:";
    		str += m_ListInfo.GetItemText(pNMLV->iItem, 1);
    		str += L"    国家:";
    		str += m_ListInfo.GetItemText(pNMLV->iItem, 2);
    		SetDlgItemText(IDC_STATIC1, str);
    	}
    
    	*pResult = 0;
    }
    

树形控件

  • tree control

  • 树形控件在windows系统中是很常见的,比如:资源管理器左侧的窗口中就有用来显示目录的树形视 图。

  • 树形视图中以分层结构显示数据,每层的缩进不同,层次越低缩进越多。

  • 树形控件的节点一般都由以下两部分组成:

    1. 标签。用来描述该节点
    2. 图标。用图标来表示该节点
  • 树形控件在插入新节点时会稍麻烦,之前的列表框在插入时调用“AddString”成员函数即可。在树形控件 中则需要指定新节点与已有节点的关系。

  • 树形控件与列表视图控件一样,可以在每一个节点的左边加入图标。

树形控件示例

  1. 拖入一个“tree control”。修改好ID

    3个属性中必需操作:行在根处true、具有行true、具有按钮true

  2. 为这个“tree control”绑定一个变量。

  3. 初始化:

    CTreeCtrl m_tree;//属性控件
    CImageList m_pImageList;//图片容器
    
    m_pImageList.Create(16, 16, ILC_COLOR32, 2, 2);
    CBitmap tempBitmap;
    tempBitmap.LoadBitmapW(IDB_BITMAP1);
    m_pImageList.Add(tempBitmap, RGB(0, 0, 0));
    tempBitmap.DeleteObject();
    tempBitmap.LoadBitmapW(IDB_BITMAP2);
    m_pImageList.Add(tempBitmap, RGB(0, 0, 0));
    tempBitmap.DeleteObject();
    
    m_tree.SetImageList(&m_pImageList, LVSIL_NORMAL);
    
    HTREEITEM hRoot = m_tree.InsertItem(_T("中国"), 
                                        0,//没选中的状态
                                        1,//选中的状态
                                        TVI_ROOT);//设置根节点
    
    HTREEITEM h1 = m_tree.InsertItem(_T("湖南省"), 0, 1, hRoot);
    HTREEITEM h2 = m_tree.InsertItem(_T("北京市"), 0, 1, hRoot);
    
    HTREEITEM h1_1 = m_tree.InsertItem(_T("长沙市"), 0, 1, h1);
    HTREEITEM h1_2 = m_tree.InsertItem(_T("株洲市"), 0, 1, h2);
    
    HTREEITEM h1_1 = m_tree.InsertItem(_T("朝阳区"), 0, 1, h1);
    HTREEITEM h1_2 = m_tree.InsertItem(_T("东城区"), 0, 1, h2);
    
posted @ 2022-06-19 22:20  Quirkygbl  阅读(36)  评论(0编辑  收藏  举报