MFC(2017/9/21)

学习使用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;
}

2017/9/20学习内容:
(1)如何设置窗口背景
VC++6.0 版本编译器:按Alt+w 设置Class Info ->Message filter:Window 确定
按Alt+w ,Message Maps 选中你需要加背景的窗口类 ->添加WM_ERASEBKGND函数
BOOL CMyCourse::OnEraseBkgnd(CDC* pDC)
{
 // 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;
}
总结:4个类,其中3个类目的为了获取参数而设立,1个类CDC用于提供StretchBlt画背景的匹配窗口模板.
CDC实际上是内存设备,它存放的内容就是自定义图像,再通过StretchBlt缩小成窗口大小并且投影在窗口上.
导入BITMAP图像必须要.BMP类型的,可用系统自带的画图工具打开->通过另保存方式修改为BMP类型的图像,VC++6.0支持是256像素以上的,不用管那个提示即可






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值