mfc下listbox控件显示字符串,实现字符格式输出的问题: 我知道%ns,但是显示有问题。求指导
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mfc下listbox控件显示字符串,实现字符格式输出的问题: 我知道%ns,但是显示有问题。求指导相关的知识,希望对你有一定的参考价值。
str.Format(L"%-10s%-8s%-8s%-8s%-8s%-8s%-8s",m_pSet->m_sno,m_pSet->m_sname,m_pSet->m_sex,m_pSet->m_college,m_pSet->m_dept,m_pSet->m_position,m_pSet->m_phone);
m_list2.AddString(str);
怎么让输出的字符串能够输出显示(不够补空格),从而达到列表美观
用list control吧, 用法如下:
void CFindStuInfoDlg::OnInitList() //初始化list control控件列
m_list.InsertColumn(0,"编号",LVCFMT_CENTER,90,-1);
m_list.InsertColumn(1,"姓名",LVCFMT_CENTER,80,-1);
m_list.InsertColumn(2,"性别",LVCFMT_CENTER,50,-1);
m_list.InsertColumn(3,"导师",LVCFMT_CENTER,60,-1);
m_list.InsertColumn(4,"入学年",LVCFMT_CENTER,60,-1);
m_list.InsertColumn(5,"出生年",LVCFMT_CENTER,60,-1);
m_list.InsertColumn(6,"专业",LVCFMT_CENTER,100,-1);
m_list.InsertColumn(7,"籍贯",LVCFMT_CENTER,120,-1);
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//当选中某行时全选
void CFindStuInfoDlg::DisplayInfo() //显示list control控件信息
CString number,name,sex,tutor,comeYear,stuYear,specialty,place;
int index=0;
while(!m_rec->adoEOF) //从数据库中读取数据显示到控件上
number=(char*)(_bstr_t)m_rec->GetCollect("stuID");
m_list.InsertItem(index,number);
name=(char*)(_bstr_t)m_rec->GetCollect("stuName");
m_list.SetItemText(index,1,name);
sex=(char*)(_bstr_t)m_rec->GetCollect("stuSex");
m_list.SetItemText(index,2,sex);
tutor=(char*)(_bstr_t)m_rec->GetCollect("teaID");
m_list.SetItemText(index,3,tutor);
comeYear=(char*)(_bstr_t)m_rec->GetCollect("comeYear");
m_list.SetItemText(index,4,comeYear);
stuYear=(char*)(_bstr_t)m_rec->GetCollect("stuYear");
m_list.SetItemText(index,5,stuYear);
specialty=(char*)(_bstr_t)m_rec->GetCollect("specialty");
m_list.SetItemText(index,6,specialty);
place=(char*)(_bstr_t)m_rec->GetCollect("comeFrom");
m_list.SetItemText(index,7,place);
m_rec->MoveNext(); //下一记录
index++;
m_nCount=m_list.GetItemCount(); //获取控件上的记录数并显示
UpdateData(false);
追问
本来想采用这控件的,发现没弄清楚,显示老有问题,自己学的比较菜。不过你的回答很有启发,谢谢
参考技术A 在Format之前,你把字符串长度求出来,例如名字那一列,你设定名字为8个字节,当第一排得到的是6个字节,则补2个空格,第三排得到的名字为4个字节,补上4个空格,这样就可以达到对齐的效果了,不知道理解了没,希望对你又帮助,可以给我发消息探讨追问理解其一,%ns不是本身就可以补空格么?那应该能达到效果,可是出现这种情况,实在不解。具体如何改进呢?中文字符算两个吧?
参考技术B listbox不是表格控件,还是用list control控件吧。MFC控件之Combo Box
下拉链表Combo-box Control
常用属性:
Sort:对添加到列表框的字符串进行自动排序。(对指定位置的元素项无效)
Type:有三个类型
Simple:没有下拉按钮,可以输入字符串,可以通过上下左右切换显示的item。
Dropdown:有下拉按钮,可以输入,可以下拉选择item。
下拉列表:有下拉按钮,不可以输入,可以下拉选择item。
列表框常用消息映射宏
ON_CBN_DBLCLK 鼠标双击
ON_CBN_DROPDOWN 列表框被弹出
ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在输入框失去 / 得到输入焦点时产生
ON_CBN_SELCHANGE 列表框中选择的行发生改变
ON_CBN_EDITUPDATE 输入框中内容被更新
控件焦点问题
通常要判断控件是否获得了焦点,可以用GetFocus()函数
例如:if(GetFocus() == GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。
但是combobox 的焦点不同,因为它是由edit和listbox两部分组成的
所以获得焦点要用GetParent():if((GetFocus()->GetParent()) == GetDlgItem(IDC_COMBO_CF))
常用操作:
//下拉链表添加item
m_combox_one.AddString(_T("zero"));
m_combox_one.AddString(_T("one"));
m_combox_one.AddString(_T("four"));
m_combox_one.AddString(_T("five"));
m_combox_one.AddString(_T("six"));
m_combox_one.AddString(_T("seven"));
m_combox_one.AddString(_T("eight"));
m_combox_one.AddString(_T("nine"));
m_combox_one.AddString(_T("ten"));
//下拉链表指定位置插入item
m_combox_one.InsertString(2, _T("insert two"));
m_combox_one.InsertString(3, _T("insert three"));
//设置下拉链表最大显示item个数
int maxshowitem = 5;
m_combox_one.SetMinVisibleItems(maxshowitem);
//通过index设置需要显示的item内容
int nshowindex = 2;
m_combox_one.SetCurSel(nshowindex);
//从下拉链表得到被选择显示的item的index
int ngetIndex = m_combox_one.GetCurSel();
//获取指定index的item的内容
int nIndex = 0;
CString strCBText;
m_combox_one.GetLBText(nIndex, strCBText);
//通过控件获取被选中显示的item的内容
CString strWinText;
GetDlgItem(IDC_COMBOX_ONE)->GetWindowTextW(strWinText);
//通过item内容查找其index
int nStartAfter = 0;
CString itemstring = _T("four");
int nfindstringIndex = m_combox_one.FindStringExact(nStartAfter, itemstring);
nfindstringIndex = m_combox_one.FindString(nStartAfter, itemstring);
//通过item内容,指定其显示的item,并且返回item的index
CString itemcontain= _T("insert three");
int nincludestringIndex = m_combox_one.SelectString(nStartAfter, itemcontain);//删除指定index位置的item
int ndeleteindex = 5;
m_combox_one.DeleteString(ndeleteindex);
// ((CComboBox*)GetDlgItem(IDC_COMBOX_ONE))等效于m_combox_one
//取得item数
int iCount = ((CComboBox*)GetDlgItem(IDC_COMBOX_ONE))->GetCount();
//清除目前所有项
//m_combox_one.ResetContent();
//设置或得到输入框中被选中的字符位置
int nStartChar = 1;
int nEndChar = 3;
m_combox_one.SetEditSel(nStartChar, nEndChar);
DWORD editsel=m_combox_one.GetEditSel(); //取不到结果?????
//设置输入框中可输入的最大字符数。
int nMaxChars = 20;
m_combox_one.LimitText(nMaxChars);
//通过item内容查找其index
int nStartAfter = 0;
CString itemstring = _T("four");
int nfindstringIndex = m_combox_one.FindStringExact(nStartAfter, itemstring);
itemstring = _T("fo");//查找前缀匹配的item
nfindstringIndex = m_combox_one.FindString(nStartAfter, itemstring);
以上是关于mfc下listbox控件显示字符串,实现字符格式输出的问题: 我知道%ns,但是显示有问题。求指导的主要内容,如果未能解决你的问题,请参考以下文章
VS2010里MFC中的ListBox为啥输出字符时,显示不出字体,只能看到有这一项?
创建用于在 MFC 控件上使用 printf 样式字符串格式显示状态更新的函数