学习使用MFC的CtrlList控件常用事件和相应函数
(1)LVN_ITEMCHANGED 列表控件里的一列被改变的时候发生
typedef struct tagNMLISTVIEW
{
NMHDR hdr;
int iItem;//主项头的标识符,0表示没有
int iSubItem;//子项的标识符(行单元) 0表示没有 还行
UINT uNewState;//新状态标识符 0表示没有改变状态变为新状态 旧->新 略懂
UINT uOldState;//旧状态标识符 0表示没有使用旧状态 新->旧 略懂
UINT uChanged;//项变化标识符 0表示没有变化(后面还有一堆)不懂!
POINT ptAction;//指定一个表示事件发生位置的点结构。这个成员对于不使用它的消息是未定义的。不懂!
LPARAM lParam;//指定该项目的应用程序定义的32位值。这个成员对于不使用它的消息是未定义的。不懂!
} NMLISTVIEW, FAR *LPNMLISTVIEW;
void CMyStudentSystem::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(pNMListView->uChanged==LVIF_STATE)//LVIF_STATE代表uChanged有效 (宏定义类型UINT无符号整数)
{ //第一个if判断列表是否有变化,有就进入
if(pNMListView->uNewState & LVIS_SELECTED)//跟上面差不多意思,&运算之后判断uNewState有效
{
//第二个if判断列表是否有列表的内容某行被选择
int nItem=pNMListView->iItem;//将这一行的标识符可理解为链表的头指针
//编辑控件edit获取选中行内容并且显示
m_sno=m_list.GetItemText(nItem,0);
m_name=m_list.GetItemText(nItem,1);
m_sex=m_list.GetItemText(nItem,2);
m_age=m_list.GetItemText(nItem,3);
m_dept=m_list.GetItemText(nItem,4);
UpdateData(false);
}
}
*pResult = 0;
}
(2)NM_DBLCLK 双击(左击)列表控件内容某行头发生
void CMyStudentSystem::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NM_LISTVIEW *pNMListView=(NM_LISTVIEW *)pNMHDR;
if(pNMListView->iItem>=0&& pNMListView->iItem< m_list.GetItemCount())判断是否点击在列表控件内容中
{
int nItem=pNMListView->iItem;
m_list.DeleteItem(nItem);//调用DeleteItem(行索引)函数删除指定一行(鼠标双击那行)
count--;//行数减1 这个变量在MyStudentSystem.h头文件中声明,CMyStudentSystem.cpp中初始化为0
}
*pResult = 0;
}
(3)CListCtrl类成员函数设置 (选中某行整行全亮+网格线)风格
m_list.SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );
(4)InsertColumn()增加列表控件的列表项
m_list.InsertColumn(序号,_T("列名"),对齐格式,列宽度,-1);最后一个-1是表示该列名还没有子项索引.
对齐格式分别有: LVCFMT_LEFT LVCFMT_RIGHT LVCFMT_CENTER
DeleteColumn(0);删除当前LIST控件默认指向的列表名,注意:删除第一个(最左边的序号为0的列名)后,原来序号为1的变为序号为0,所以一直用DeleteColumn(0);就可以接着删除.
(5)IVN_DELETEITEM()删除某一行内容时发生
void CMyStudentSystem::OnDeleteitemList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
int nItem=pNMListView->iItem;
CString s;
s.Format("你删除了第%d行",nItem+1);
AfxMessageBox(s);
*pResult = 0;
}
{
// TODO: Add your message handler code here and/or call default
CBitmap bitmap;//建立位图对象
bitmap.LoadBitmap(IDB_BITMAP2); //位图对象设置为选择IDB_BITMAP2位图
BITMAP bmp;//图像结构体获取图像参数
bitmap.GetBitmap(&bmp);//将位图IDB_BITMAP2数据给结构体bmp
CDC dcCom;//建立一个虚拟图对象
dcCom.CreateCompatibleDC(pDC);//建立一个DC虚拟图,是与pDC兼容的图(系统给的当前窗口).
dcCom.SelectObject(&bitmap);//虚拟图选择以IDB_BITMAP2位图为模板
CRect rect;//窗口对象
GetClientRect(&rect);//获取窗口参数:宽,高.
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCom,0,0, bmp.bmWidth,bmp.bmHeight,SRCCOPY);//SRCCOPY 复制模式进行变化
return true;
}