【MFC】编辑框、下拉框、列表控件
目录
编辑框
设置换行
设置垂直滚动条
获取/设置文本
下拉框
添加选项
设置选项不排序
设置默认选中项
获取选中索引位置和对应文本
列表
编辑
插入表头
插入正文
设置列表控件其他属性
设置整行选中、列之间的分隔符
编辑框
我们可以通过对话框窗口拖拽一个编辑框,如下:
设置换行
MFC中编辑框默认是单行的,也就是说不管内容的长度是多少,默认显示为一行,在这种情况下我们按回车也是没有用的。
此时同时设置编辑框的两个属性
- "want return":为true让编辑框接受回车
- "multiline":允许编辑框显示内容为多行
如下图所示,不过示例中因为作了汉化,属性名称为中文
设置垂直滚动条
如下,将auto HScroll属性设置为true,垂直滚动属性是增加显式滚动条,方便我们拖拽
如果不设置auto HScroll属性,编辑框的内容换行到达编辑框的的高度上限时,将无法正常继续换行。
获取/设置文本
首先绘制一个demo界面,如下,蓝字为对应控件的控件id
将按钮绑定对应的点击响应事件
void CMFCApplication1Dlg::OnBnClickedBtnCopy()
{CString csText;GetDlgItem(IDC_EDT_SRC)->GetWindowTextW(csText);GetDlgItem(IDC_EDIT_DEST)->SetWindowTextW(csText);
}
随后便可实现复制的效果,这里主要使用两个方法:
int GetWindowTextW(HWND hWnd, // 窗口句柄LPWSTR lpString, // 接收文本的缓冲区int nMaxCount // 缓冲区最大字符数
);BOOL SetWindowTextW(HWND hWnd, // 窗口句柄LPCWSTR lpString // 要设置的文本
);
下拉框
在进行下面操作前,需要先绑定变量
添加选项
在OnInitDialog()对话框初始化函数通过AddString的方法
m_cmbTest.AddString(L"选项1");m_cmbTest.AddString(L"选项2");m_cmbTest.AddString(L"选项3");
效果如下:
设置选项不排序
mfc中下拉框选项默认是排序的,不是按照添加的顺序,这里有两种方法:
第一种是通过界面,设置下拉框的sort属性,比较直接一点
第二种是通过ModifyStyle方法移除属性
如下是ModifyStyle方法的参数
BOOL ModifyStyle(DWORD dwRemove, // 要移除的样式DWORD dwAdd, // 要添加的样式UINT nFlags = 0 // 重绘标志(可选)
);
移除掉CBS_SORT属性
m_cmbTest.ModifyStyle(CBS_SORT, 0);
同理,下拉框常见的属性如下:
- CBS_DROPDOWN : 标准下拉框,有编辑框和下拉列表
- CBS_DROPDOWNLIST : 只读下拉框,只能选择不能编辑
- CBS_SIMPLE : 简单组合框,编辑框和列表框同时显示
- CBS_SORT : 自动按字母顺序排序选项(创建后无法修改)
设置默认选中项
在OnInitDialog()对话框初始化函数通过SetCurSel的方法,这里是通过选项下标来设置的
m_cmbTest.SetCurSel(1);
效果如下:
获取选中索引位置和对应文本
这里新增一个按钮,在其点击事件中弹出选中项文本
void CMFCApplication1Dlg::OnBnClickedButton2(){int nPos = m_cmbTest.GetCurSel();CString csText;m_cmbTest.GetLBText(nPos, csText);MessageBox(csText);
}
效果如下:
列表
在进行下面操作前,同样先将列表控件绑定变量
插入表头
mfc中,要给列表控件添加表头,使用如下方法:
int InsertColumn(int nCol, // 列索引(从0开始)LPCTSTR lpszColumnHeading, // 列标题文本int nFormat = LVCFMT_LEFT, // 对齐方式int nWidth = -1, // 列宽度int nSubItem = -1 // 子项索引
);
在添加表头之前, 需要先将列表控件设置为 详细信息视图 (也叫报表视图),这样表头才能正常显示
m_list.SetView(LV_VIEW_DETAILS); //将列表控件设置为 详细信息视图 (也叫报表视图)m_list.InsertColumn(0, L"编号", LVCFMT_CENTER, 100);m_list.InsertColumn(1, L"姓名", LVCFMT_CENTER, 100);m_list.InsertColumn(2, L"年龄", LVCFMT_CENTER, 100);
效果如下:
插入正文
在插入正文的时候,表头是不算入正文的,因此列表的正文索引还是从0开始。
插入的时候,先插入新行,在插入其他列的内容。
// 插入新行
int nItem = m_list.InsertItem(行索引, L"第一列内容");// 设置其他列的内容
m_list.SetItemText(nItem, 列索引, L"列内容");
如下代码:
int nItem = m_list.InsertItem(0, L"001");m_list.SetItemText(nItem, 1, L"张三");m_list.SetItemText(nItem, 2, L"25");
效果如下:
注意:当插入新的列的时候,索引如果超出表头最大索引,则不显示 。
设置列表控件其他属性
1、选择模式
// 单选(默认)
LBS_NOSEL // 不允许选择
LBS_MULTIPLESEL // 多选模式
LBS_EXTENDEDSEL // 扩展选择模式(Ctrl+点击,Shift+点击)
2、排序与显示
LBS_SORT // 自动排序
LBS_HASSTRINGS // 包含字符串(默认)
LBS_OWNERDRAWFIXED // 自绘固定高度项目
LBS_OWNERDRAWVARIABLE // 自绘可变高度项目
3、滚动条
LBS_DISABLENOSCROLL // 禁用时显示滚动条
LBS_NOINTEGRALHEIGHT // 允许部分显示项目
LBS_WANTKEYBOARDINPUT // 接收键盘输入消息
4、显示效果
LBS_MULTICOLUMN // 多列显示
LBS_USETABSTOPS // 使用制表符
LBS_NOTIFY // 发送通知消息给父窗口
设置整行选中、列之间的分隔符
- LVS_EX_FULLROWSELECT:整行选中
- LVS_EX_GRIDLINES:设置网格
m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
效果如下: