一.List Control列表控件(隶属于CListCtrl类)
1. CListCtrl 风格
LVS_ICON: //为每个item显示大图标
LVS_SMALLICON: //为每个item显示小图标
LVS_LIST: //显示一列带有小图标的item
LVS_REPORT: //显示item详细资料
//直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
2. 设置listctrl 风格及扩展风格
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
3. 插入数据
m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, "11");//插入行
m_list.SetItemText(nRow, 1, "jacky");//设置数据
4. 删除所有列
// 方法一:
while ( m_list.DeleteColumn (0))
//因为你删除了第一列后,后面的列会依次向上移动。
//方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
5. 单行删除(删除最后一行)
int n = 0;//全局变量,代表之前添加的行
if(n == 0)
{
AfxMessageBox("列表中无项目,请添加");
return FALSE;
}
n--;
m_list.DeleteItem(n);
6. 单行删除(删除选中行)
if(n == 0)
{
AfxMessageBox("列表中无项目,请添加");
return FALSE;
}
for(int i=0;i<m_list.GetItemCount();i++)
{
if(m_list.GetItemState(i,LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))//复选框被选中或者该行被选中
{
m_list.DeleteItem(i);
n--;
}
}
二.ComboBox控件
1.在类向导中创建控件关联成员变量m_Combo,类型为CComboBox
控件属性为下拉列表,并去掉分类属性(按照写入字串的顺序排序而非字母顺序)。
2.在初始化函数OnInitDialog()中添加控件初始化显示的内容
m_Combo.AddString("汉族");
m_Combo.AddString("其他");
// ((CComboBox*)GetDlgItem(IDC_NATION))->AddString("另一种");//此方法也可以,但是不够简单
m_Combo.SetCurSel(0);//初始化选择"汉族"
3.获取当前选择字串
CString str;
int nSel = m_Combo.GetCurSel();
m_Combo.GetLBText(nSel,str);
代码
BOOL CListctrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//去掉CComboBox分类属性
m_Nation.AddString("汉族");
m_Nation.AddString("其他");
// ((CComboBox*)GetDlgItem(IDC_NATION))->AddString("haiyou");//此方法也可以,但是不够简单
m_Nation.SetCurSel(0);
// m_list.Create(LVS_REPORT,CRect(0,0,100,100),this,IDC_LIST);
// Add "About..." menu item to system menu.
AddList();
// 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);
}
}
// 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
}
//列表属性要调成“报告”
BOOL CListctrlDlg::AddList()
{
for(int i=0;i<10;i++)
{
m_list.DeleteColumn(i);
}
m_list.InsertColumn(0,"工号",LVCFMT_LEFT,60);
m_list.InsertColumn(1,"姓名",LVCFMT_LEFT,70);
m_list.InsertColumn(2,"部门",LVCFMT_LEFT,50);
m_list.InsertColumn(3,"性别",LVCFMT_LEFT,50);
m_list.InsertColumn(4,"学历",LVCFMT_LEFT,60);
m_list.InsertColumn(5,"外语",LVCFMT_LEFT,60);
m_list.InsertColumn(6,"民族",LVCFMT_LEFT,60);
m_list.InsertColumn(7,"入职日期",LVCFMT_LEFT,100);
//设置背景及风格
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);
m_list.SetBkColor(RGB(220,240,240)); //设置背景颜色
m_list.SetTextBkColor(RGB(220,240,240));//设置文字背景颜色
m_list.SetTextColor(RGB(128,64,0)); //设置文字颜色
return TRUE;
}
//增加行的函数
BOOL CListctrlDlg::AddListItem()
{
UpdateData();//更新数据,不添加此行,数据无法及时传递进来
if(m_szName == ""||m_szNumber == ""||m_szBranch == "")
{
AfxMessageBox("不能有项为空,请填充后再添加!");
return FALSE;
}
int nCount = m_list.GetItemCount();//获取当前已经存在的行数
m_list.InsertItem(nCount,m_szNumber);
m_list.SetItemText(nCount,1,m_szName);
m_list.SetItemText(nCount,2,m_szBranch);
m_list.SetItemText(nCount,3,m_nSex?"女":"男");
char *p[]={"高中","大学","硕士","博士"};
m_list.SetItemText(nCount,4,p[m_nEduca]);
//对于复选框,选中为真,初始化都为FALSE(定义成员变量的时候在构造函数中已经初始化)
CString str;
if(m_bEngl)
str += "英";
if(m_bJapa)
str += "日";
if(m_bRuss)
str += "俄";
if(m_bKorea)
str += "韩";
if(str.IsEmpty())
str += "无";
m_list.SetItemText(nCount,5,str);
int nSel = m_Nation.GetCurSel();
m_Nation.GetLBText(nSel,str);
m_list.SetItemText(nCount,6,str);
str.Format("%d-%d-%d",m_dtJoin.GetYear(),m_dtJoin.GetMonth(),m_dtJoin.GetDay());
m_list.SetItemText(nCount,7,str);
// ++n;
return TRUE;
}
//删除行的函数
BOOL CListctrlDlg::DeleteListItem()
{
// while ( m_list.DeleteColumn (0)); //删除列
/* if(n == 0)
{
AfxMessageBox("列表中无项目,请添加");
return FALSE;
}
for(int i=0;i<m_list.GetItemCount();i++)
{
if(m_list.GetItemState(i,LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))//复选框被选中或者该行被选中
{
m_list.DeleteItem(i);
n--;
}
}*/
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
{
AfxMessageBox("请先选择一行再删除!");
return FALSE;
}
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
m_list.DeleteItem(nItem);
}
}
return TRUE;
}
//修改行内容
BOOL CListctrlDlg::ModListItem()
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
{
AfxMessageBox("请先选择一行再修改!");
return FALSE;
}
int nItem = m_list.GetNextSelectedItem(pos);
UpdateData();
// int nCount = m_list.GetItemCount();//获取当前已经存在的行数
m_list.SetItemText(nItem,0,m_szNumber);
m_list.SetItemText(nItem,1,m_szName);
m_list.SetItemText(nItem,2,m_szBranch);
m_list.SetItemText(nItem,3,m_nSex?"女":"男");
char *p[]={"高中","大学","硕士","博士"};
m_list.SetItemText(nItem,4,p[m_nEduca]);
//对于复选框,选中为真,初始化都为FALSE(定义成员变量的时候在构造函数中已经初始化)
CString str;
if(m_bEngl)
str += "英";
if(m_bJapa)
str += "日";
if(m_bRuss)
str += "俄";
if(m_bKorea)
str += "韩";
if(str.IsEmpty())
str += "无";
m_list.SetItemText(nItem,5,str);
int nSel = m_Nation.GetCurSel();
m_Nation.GetLBText(nSel,str);
m_list.SetItemText(nItem,6,str);
str.Format("%d-%d-%d",m_dtJoin.GetYear(),m_dtJoin.GetMonth(),m_dtJoin.GetDay());
m_list.SetItemText(nItem,7,str);
return TRUE;
}
//增加行的按钮响应
void CListctrlDlg::OnAdd()
{
AddListItem();
}
//修改按键
void CListctrlDlg::OnMod()
{
ModListItem();
}
//删除行按钮响应
void CListctrlDlg::OnDeleteall()
{
DeleteListItem();
}
//主要是为了添加是否关闭对话框消息
void CListctrlDlg::OnClose()
{
if(AfxMessageBox("是否关闭窗口?",MB_YESNO) == IDYES)
CDialog::OnClose();
else
return;
}