【前话】
编译原理的第一个实验——词法分析器验收时,老师要求最后的结果用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()。
我用了一个基于对话框的MFC程序进行测试。 第一步:创建基于对话框的MFC应用程序 第二步:在对话框上添加一个List Control控件 第三步:给ListControl控件绑定一个ListControl类型的控件变量:m_List 第四步:给对话框上的ListControl控件添加NM_CUSTOMDRAW事件的消息处理函数OnNMCustomdrawList1 代码如下: void CTestListCtrlDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLVCUSTOMDRAW pLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR); *pResult = CDRF_DODEFAULT; // TODO: 在此添加控件通知处理程序代码 COLORREF crText; if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) { *pResult = CDRF_NOTIFYITEMDRAW; } else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) { if ( (pLVCD->nmcd.dwItemSpec % 3) == 0) { crText = RGB(255,0,0); } else if((pLVCD->nmcd.dwItemSpec % 3) == 1) { crText = RGB(0,255,0); } else { crText = RGB(128,128,255); } pLVCD->clrText = crText; *pResult = CDRF_DODEFAULT; } } 这里注意的一点就是这句代码:*pResult = CDRF_DODEFAULT;,一定要写在else if 语句的最后,我当时由于马虎,把这句写在了这个函数的最后,就是else if 语句后面了,导致ListControl控件里的颜色没有发生变化,害了我在网上查了两个小时,
[cpp] view plain copy 选中style中的 Show selection always, 或者添加扩展样式 LVS_SHOWSELALWAYS
//或者参考 地址
[cpp] view plain copy BOOL CImageDlg::OnInitDialog() { CDialog::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) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } DWORD dwStyle = m_list.GetExtendedStyle(); //获取当前扩展样式 dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时) dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时) m_list.SetExtendedStyle(dwStyle); //设置扩展风格 m_list.InsertColumn(0,"ID"); m_list.InsertColumn(1,"位置(X)"); m_list.InsertColumn(2,"位置(Y)"); m_list.InsertColumn(3,"旋转角度(Angle)"); m_list.InsertColumn(4,"匹配分数(Score)"); CRect rect; m_list.GetClientRect(rect); m_list.SetColumnWidth(0,rect.Width()/5); m_list.SetColumnWidth(1,rect.Width()/5); m_list.SetColumnWidth(2,rect.Width()/5); m_list.SetColumnWidth(3,rect.Width()/5); m_list.SetColumnWidth(4,rect.Width()/5);</span> // 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 return TRUE; // return TRUE unless you set the focus to a control }
