【前话】
编译原理的第一个实验——词法分析器验收时,老师要求最后的结果用GUI的形式表现出来。想想确实,黑白的控制台应用程序界面在用户操作时的确不如GUI 友好。GUI界面也算是大势所趋。我现在掌握三种语言的基本语法——c/c++、Java和python。python好久之前学过然后没用就忘记了,最 近想写网络爬虫才又重新去看,对于python写GUI也是一窍不通,不做考虑。自认为Java写GUI比较方便,但是实验代码已经用c写完了,所以最后 决定用mfc做这个GUI。
到了大二下陆陆续续的做了一些mfc,每次用一个新控件都是网上各种找然后XJBG一下就完成了。每次要用的时候又要找,所以打算每学习一个控件就就写个随笔系统地记录一下使用方法和心得。
废话不说,下面上list control的用法。
【list control】
在console中可以用#include<iomanip>的setw()来设置输出的格式,原本认为mfc里的控件edit control里也这样输出一下就可以了,结果做出来的效果是这样的:
看来用setw()方法不能得到想要的效果,而且edit control里的文本可以随意更改,所以想找一个类似列表的控件作为输出显示。
最后得到这样的效果,就要用到今天要介绍的list control。
拖到对话框后的显示是这样的:
选中控件,修改将外观中的View项从Icon改为Report,再调整大小。
然后右键->类向导->成员变量,设置如下图:
接下来在CProjectNameDlg.cpp文件的OnInitDialog()函数中初始化list的列属性并进行设置:
DWORD dwStyle = m_list.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; m_list.SetExtendedStyle(dwStyle);
第一句得到m_list的风格。
LVS_EX_FULLROWSELECT为整行选中,当鼠标点击某个单元式那一整行都选中。
LVS_EX_GRIDLINES为添加网格线。
第四句将我们配置的风格添加到m_list。
接下去设置每列的属性:
m_list.InsertColumn(0, _T(" "), LVCFMT_LEFT, 25); m_list.InsertColumn(1, _T("单词"), LVCFMT_LEFT, 60); m_list.InsertColumn(2, _T("二元序列"), LVCFMT_LEFT, 80); m_list.InsertColumn(3, _T("类型"), LVCFMT_LEFT, 80); m_list.InsertColumn(4, _T("位置(行,列)"), LVCFMT_LEFT, 100);
我按照自己的理解来说下函数的用法。InsertColumn(设置的列是第几列,列的属性名,属性名的格式,列宽)。
然后就是在触发某个控件后在list control中显示。这里触发可以是按了某个按钮或者读入了某个文件Balabala...
m_list.InsertItem(n, CStr1); m_list.SetItemText(n, 1, CStr2); m_list.SetItemText(n, 2, CStr3); m_list.SetItemText(n, 3, CStr4); m_list.SetItemText(n, 4, CStr5);
InsertItem(n, CStr) 是将CStr加入第n行第0列。这里n也是从0开始计的。
SetItemText(n, line, CStr) 是在第n行第line列加入CStr。但是如果用SetItemText加入第0列的元素是没效果的
我的理解是先用InsertItem()申请了一行的list可用,后面的才可以用SetItemText()加入。
两个函数插入list中的元素必须是CString类型。我一般都是把所有东西转化成string,然后用CString CStr(string.c_str())来解决的。。。
然后CY告诉我一个很好用的东西:stringstream。以后用的多了也写篇随笔总结下好了。
最后是list control的清空方法:m_list.DeleteAllItems()。