06. 基本控件(下)
基本控件(下)
列表框控件
- list box
- 列表框给出了一个选项清单,允许用户从中进行单项或多项选择,被选中的项会高亮显示。
- 列表框可分为:
- 单选列表框:一次只能选择一个列表框。
- 多选列表框:可以同时选择多个列表框。
列表框示例
-
创建一个mfc的基于对话框工程。
-
在资源视图中,找到对话框,在对话框界面上点击右键,修改属性。
-
然后在工具箱里面,找到“list box”,拖动一个列表框到主对话框的面板。
-
再在工具箱里面,拖动一个“Group Box”,把刚刚的"list Box"包围起来。然后把“Group Box”的 caption修改为:“世界著名IT公司”。
-
修改ID,添加变量。
-
接下来是初始化这个控件。
//在列表的指定位置插入一项字符串 m_ListBox.InsertString(0, _T("微软公司"));//索引,字符串 m_ListBox.InsertString(0,_T("C语言"));//在某个位置插入字符串 //m_ListBox.AddString(_T("C++"));//尾插,但是索引不明确,因此不建议使用
-
继续添加。
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"));
-
如需要把这些字符串取出来,就是鼠标点中某个字符串,就要得到该字符串。 为“list box”控件。生成一个消息处理函数。
-
在该函数中书写代码:
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
-
组合框其实就是把一个编辑框和一个列表框组合到了一起。
-
分为三种:
- 简易(simple)组合框 :不可展开
- 下拉式(dropdown)组合框 : 可展开可编辑的组合框
- 下拉列表式(drop list)组合框 : 可展开不可编辑的组合框
组合框示例
-
拖入一个”静态文本“,取名为:”你的毕业学校:“。然后再拖入一个”combo box“,修改该”combo box“的id。
-
为”combo box“这个控件添加变量。
-
给这个控件去做一些初始化,提供一些字符串,给用户去选择。(和列表框一样)
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"));
-
如想设置默认值,可以在初始化后面加上一句
m_combo.SetCurSel(0);//设置下标为0对应的是默认的字符串
-
想得到用户的选择,生成"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); } }
-
接下来,一个光标资源(.cur)文件导入。
-
为消息”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)两部分。
- 图标是对列表项图形描述。标签是文字描述。
- 当然列表项可以只包含图标或只包含标签。
列表视图控件示例
-
拖入一个”list control“控件。修改 属性 -> 视图 ”View“为”report“(report报表最常用,),修改ID。 第0列只能设置左对齐或者右对齐,之后的才可以主动调整
-
拖入一个”静态文本“,修改名字:”你想了解的大学:“。拖入”edit control“,来用显示用户在list control中选择后的字符串。修改ID
-
进行初始化,在初始化之前,先给这个控件绑定一个变量。
-
在初始化函数中加上代码:
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("中国"));
-
当用户用鼠标点击某一条时,需要把这条的数据字符串显示到下方的"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系统中是很常见的,比如:资源管理器左侧的窗口中就有用来显示目录的树形视 图。
-
树形视图中以分层结构显示数据,每层的缩进不同,层次越低缩进越多。
-
树形控件的节点一般都由以下两部分组成:
- 标签。用来描述该节点
- 图标。用图标来表示该节点
-
树形控件在插入新节点时会稍麻烦,之前的列表框在插入时调用“AddString”成员函数即可。在树形控件 中则需要指定新节点与已有节点的关系。
-
树形控件与列表视图控件一样,可以在每一个节点的左边加入图标。
树形控件示例
-
拖入一个“tree control”。修改好ID
3个属性中必需操作:行在根处true、具有行true、具有按钮true
-
为这个“tree control”绑定一个变量。
-
初始化:
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);