本文简单地介绍下VS的listview使用:包括属性设置、背景设置、双击事件、右键弹出菜单等。

使用工具:VS2008

使用语言:C++

开发步骤:

1.新建单文档程序,View派生于ListView

2.添加菜单资源


3.设置属性

void CListViewDemoView::OnInitialUpdate()
{CListView::OnInitialUpdate();// TODO: 调用 GetListCtrl() 直接访问 ListView 的列表控件,//  从而可以用项填充 ListView。//属性设置CListCtrl& list = GetListCtrl();list.ModifyStyle(LVS_TYPEMASK,LVS_REPORT & LVS_TYPEMASK | LVS_SINGLESEL);//important for showDWORD dwStyle = list.GetExtendedStyle();list.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);CImageList image;image.Create(1,20,ILC_COLOR24 | ILC_MASK,4,0);list.SetImageList(&image,LVSIL_SMALL);CFont font;font.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,_T("宋体"));list.SetFont(&font);list.GetHeaderCtrl()->SetFont(&font);//菜单m_menu.LoadMenu(IDR_MENU1);list.SetMenu(&m_menu);//标题栏list.InsertColumn(0,_T("名称"),LVCFMT_LEFT,150,0);list.InsertColumn(1,_T("属性1"),LVCFMT_LEFT,120,0);list.InsertColumn(2,_T("属性2"),LVCFMT_LEFT,120,0);UpdateList();
}

4.更新数据

void CListViewDemoView::UpdateList(void)
{CListCtrl& list = GetListCtrl();CString str=_T("");//值设置for(int i=0; i<5; i++){str.Format(_T("name %d"),i);list.InsertItem(i,str);str.Format(_T("属性1 %d"),i);list.SetItemText(i,1,str);str.Format(_T("属性2 %d"),i);list.SetItemText(i,2,str);}
}

5.背景效果

void CListViewDemoView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;int iRow = lplvcd->nmcd.dwItemSpec;switch(lplvcd->nmcd.dwDrawStage){case CDDS_PREPAINT :{*pResult = CDRF_NOTIFYITEMDRAW;return;}// Modify item text and or backgroundcase CDDS_ITEMPREPAINT:{lplvcd->clrText = RGB(0,0,0);// If you want the sub items the same as the item,// set *pResult to CDRF_NEWFONT*pResult = CDRF_NOTIFYSUBITEMDRAW;return;}// Modify sub item text and/or backgroundcase CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:{if(iRow %2){lplvcd->clrTextBk = m_colRow2;}else{lplvcd->clrTextBk = m_colRow1;}*pResult = CDRF_DODEFAULT;return;}}
}

6.双击事件

void CListViewDemoView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CPoint CursorPoint;if(!GetCursorPos(&CursorPoint)){return;}if(-1 == pNMListView->iItem){m_nSelectItem = -1;return;}else{m_nSelectItem = pNMListView->iItem;}CListCtrl& list = GetListCtrl();CString sName = list.GetItemText(m_nSelectItem,0);CString str = _T("你双击了:") + sName;AfxMessageBox(str);*pResult = 0;
}

7.右击事件

void CListViewDemoView::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CPoint CursorPoint;if(!GetCursorPos(&CursorPoint)){return;}if(-1 == pNMListView->iItem){m_nSelectItem = -1;return;}else{m_nSelectItem = pNMListView->iItem;}CMenu* pSubMenu = NULL;pSubMenu = m_menu.GetSubMenu(0);if(pSubMenu){pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,CursorPoint.x,CursorPoint.y,this);}*pResult = 0;
}void CListViewDemoView::OnMenuSub1()
{// TODO: 在此添加命令处理程序代码CString str = _T("这是菜单一");AfxMessageBox(str);
}void CListViewDemoView::OnMenuSub2()
{// TODO: 在此添加命令处理程序代码CString str = _T("这是菜单二,哈哈");AfxMessageBox(str);
}

  

右击位置不同菜单不同

void CMyListView::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;m_nSelectItem = pNMListView->iItem;CMenu* pSubMenu = NULL;if(-1 == m_nSelectItem){pSubMenu = m_pmenu->GetSubMenu(0);}else{pSubMenu = m_pmenu->GetSubMenu(1);}if(pSubMenu){CPoint CurSorPoint;GetCursorPos(&CurSorPoint);pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,CurSorPoint.x,CurSorPoint.y,this);}*pResult = 0;
}

8.文档结构图

 

9.总代码如下

ListViewDemoView.h

// ListViewDemoView.h : CListViewDemoView 类的接口
//#pragma onceclass CListViewDemoView : public CListView
{
protected: // 仅从序列化创建CListViewDemoView();DECLARE_DYNCREATE(CListViewDemoView)// 属性
public:CListViewDemoDoc* GetDocument() const;// 操作
public:// 重写
public:virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:virtual void OnInitialUpdate(); // 构造后第一次调用// 实现
public:virtual ~CListViewDemoView();
#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;
#endifprotected:// 生成的消息映射函数
protected:DECLARE_MESSAGE_MAP()private:CMenu    m_menu;//菜单COLORREF  m_colRow1;COLORREF  m_colRow2;int m_nSelectItem;
public:void UpdateList(void);afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnMenuSub1();afx_msg void OnMenuSub2();
};#ifndef _DEBUG  // ListViewDemoView.cpp 中的调试版本
inline CListViewDemoDoc* CListViewDemoView::GetDocument() const{ return reinterpret_cast<CListViewDemoDoc*>(m_pDocument); }
#endif

ListViewDemoView.cpp

// ListViewDemoView.cpp : CListViewDemoView 类的实现
//#include "stdafx.h"
#include "ListViewDemo.h"#include "ListViewDemoDoc.h"
#include "ListViewDemoView.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CListViewDemoViewIMPLEMENT_DYNCREATE(CListViewDemoView, CListView)BEGIN_MESSAGE_MAP(CListViewDemoView, CListView)ON_NOTIFY_REFLECT(NM_DBLCLK, &CListViewDemoView::OnNMDblclk)ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CListViewDemoView::OnNMCustomdraw)ON_NOTIFY_REFLECT(NM_RCLICK, &CListViewDemoView::OnNMRClick)ON_COMMAND(ID_MENU_SUB1, &CListViewDemoView::OnMenuSub1)ON_COMMAND(ID_MENU_SUB2, &CListViewDemoView::OnMenuSub2)
END_MESSAGE_MAP()// CListViewDemoView 构造/析构CListViewDemoView::CListViewDemoView()
{// TODO: 在此处添加构造代码m_nSelectItem = -1;m_colRow1  = RGB(238,254,245);m_colRow2  = RGB(232,242,250);
//  m_colRow1 = RGB(240,247,249);
//  m_colRow2 = RGB(229,232,239);
}CListViewDemoView::~CListViewDemoView()
{
}BOOL CListViewDemoView::PreCreateWindow(CREATESTRUCT& cs)
{// TODO: 在此处通过修改//  CREATESTRUCT cs 来修改窗口类或样式return CListView::PreCreateWindow(cs);
}void CListViewDemoView::OnInitialUpdate()
{CListView::OnInitialUpdate();// TODO: 调用 GetListCtrl() 直接访问 ListView 的列表控件,//  从而可以用项填充 ListView。//属性设置CListCtrl& list = GetListCtrl();list.ModifyStyle(LVS_TYPEMASK,LVS_REPORT & LVS_TYPEMASK | LVS_SINGLESEL);//important for showDWORD dwStyle = list.GetExtendedStyle();list.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);CImageList image;image.Create(1,20,ILC_COLOR24 | ILC_MASK,4,0);list.SetImageList(&image,LVSIL_SMALL);CFont font;font.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,_T("宋体"));list.SetFont(&font);list.GetHeaderCtrl()->SetFont(&font);//菜单m_menu.LoadMenu(IDR_MENU1);list.SetMenu(&m_menu);//标题栏list.InsertColumn(0,_T("名称"),LVCFMT_LEFT,150,0);list.InsertColumn(1,_T("属性1"),LVCFMT_LEFT,120,0);list.InsertColumn(2,_T("属性2"),LVCFMT_LEFT,120,0);UpdateList();
}// CListViewDemoView 诊断#ifdef _DEBUG
void CListViewDemoView::AssertValid() const
{CListView::AssertValid();
}void CListViewDemoView::Dump(CDumpContext& dc) const
{CListView::Dump(dc);
}CListViewDemoDoc* CListViewDemoView::GetDocument() const // 非调试版本是内联的
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CListViewDemoDoc)));return (CListViewDemoDoc*)m_pDocument;
}
#endif //_DEBUG// CListViewDemoView 消息处理程序void CListViewDemoView::UpdateList(void)
{CListCtrl& list = GetListCtrl();CString str=_T("");//值设置for(int i=0; i<5; i++){str.Format(_T("name %d"),i);list.InsertItem(i,str);str.Format(_T("属性1 %d"),i);list.SetItemText(i,1,str);str.Format(_T("属性2 %d"),i);list.SetItemText(i,2,str);}
}void CListViewDemoView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CPoint CursorPoint;if(!GetCursorPos(&CursorPoint)){return;}if(-1 == pNMListView->iItem){m_nSelectItem = -1;return;}else{m_nSelectItem = pNMListView->iItem;}CListCtrl& list = GetListCtrl();CString sName = list.GetItemText(m_nSelectItem,0);CString str = _T("你双击了:") + sName;AfxMessageBox(str);*pResult = 0;
}void CListViewDemoView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;int iRow = lplvcd->nmcd.dwItemSpec;switch(lplvcd->nmcd.dwDrawStage){case CDDS_PREPAINT :{*pResult = CDRF_NOTIFYITEMDRAW;return;}// Modify item text and or backgroundcase CDDS_ITEMPREPAINT:{lplvcd->clrText = RGB(0,0,0);// If you want the sub items the same as the item,// set *pResult to CDRF_NEWFONT*pResult = CDRF_NOTIFYSUBITEMDRAW;return;}// Modify sub item text and/or backgroundcase CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:{if(iRow %2){lplvcd->clrTextBk = m_colRow2;}else{lplvcd->clrTextBk = m_colRow1;}*pResult = CDRF_DODEFAULT;return;}}
}void CListViewDemoView::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CPoint CursorPoint;if(!GetCursorPos(&CursorPoint)){return;}if(-1 == pNMListView->iItem){m_nSelectItem = -1;return;}else{m_nSelectItem = pNMListView->iItem;}CMenu* pSubMenu = NULL;pSubMenu = m_menu.GetSubMenu(0);if(pSubMenu){pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,CursorPoint.x,CursorPoint.y,this);}*pResult = 0;
}void CListViewDemoView::OnMenuSub1()
{// TODO: 在此添加命令处理程序代码CString str = _T("这是菜单一");AfxMessageBox(str);
}void CListViewDemoView::OnMenuSub2()
{// TODO: 在此添加命令处理程序代码CString str = _T("这是菜单二,哈哈");AfxMessageBox(str);
}

好了,关于VS之listview使用就到这了。

源码下载

VS之listview使用相关推荐

  1. Android ListView 点击item改变item的背景颜色(ListView实现光标移动)

    一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector  用户指定当前选中item 的颜色 ...

  2. Android ListView 删除 item

    实现效果 主要使用方法 是, remove 之后在刷新界面 adapter 里面的代码 public class MyAdapter extends BaseAdapter {private List ...

  3. ListView 添加头部 和尾部 布局 (addHeaderView 和 addFooterView)

    ListView 添加头部 和尾部 布局  其实很简单 ,listview 暴露的有方法addHeaderView 和 addFooterView 从源码里面可以看到, addHeaderView 和 ...

  4. Android ListView item设置分割线以及分割线宽度

    ListView item设置分割线的方法:setDivider ListView item设置分割线宽度的方法:setDividerHeight // 设置分割线 listView.setDivid ...

  5. Android ListView (多个adapter 说明)

    最近维护项目,项目里面使用的都是ListView 这里也对ListView 回顾一下 以下 demo 地址 ListView 在Android 里面用来实现列表的, 在xml 中创建ListView ...

  6. 玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  7. ListView style

    步骤一:在使用的ListView的activiey里使用android:theme="@style/Theme的名字" 步骤二:创建Themes.xml 在Themes.xml里定 ...

  8. Android自定义ListView的Item无法响应OnItemClick的解决办法

    转: 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就 ...

  9. 【原创】ListView快速滚动至新添加一行(自动滚动)

    在C#开发中我们经常要开发一些日志系统,尤其是基于ListView的日志显示系统. 但是当日志增多是你是否有一些困扰,就是它为什么不会自动滚动至最后一行. 以下是一小段代码,希望可以帮助你. publ ...

  10. Android使用ListView控件问题

    Android使用ListView控件问题: The application has stopped unexpectedly, please try again. 开发环境:android 1.6 ...

最新文章

  1. 联泰集群发布水晶系列工作站,用于深度学习场景
  2. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建...
  3. hdu5014 构造b数列使得t最大(小想法)
  4. 构建Android的交叉编译器、用NDK编译移植
  5. python while循环true_Python while循环,pause while not,true时继续?
  6. Visual Studio 2012资源管理器里单击打开改为双击打开文件
  7. Android 系统(219)---Android O上networkAttributes的说明
  8. 华为综合测评是什么_喝水不用等待,温度随心控随时喝到热水,测评华为智选恒温电水壶...
  9. mysql怎么添加默认约束_分享知识-快乐自己:MySQL中的约束,添加约束,删除约束,以及一些其他修饰...
  10. LeetCode(8):字符串转整数(atoi)
  11. Android AlertDialog创建过程详解
  12. 还原二叉树--根据后序中序输出先序
  13. devtmpfs文件系统创建设备节点
  14. 无线AP与无线路由器都有些什么区别?(二)
  15. 求 逆矩阵 公式推导
  16. Java学习day07-认识类和对象(单元测试Test)
  17. Scala安装教程(最详细教程)
  18. Thinkphp使用CKEditor4富文本编辑器
  19. sqlite数据库的版本更替
  20. Reporting verbs

热门文章

  1. gpib-usb-hs linux,GPIB-USB-HS GPIB适配器
  2. 新东方副总裁徐健:人工智能时代如何实现教育升级?
  3. html的div插入图片,html插入图片示例(html添加图片)
  4. C#平均值计算器具体实现
  5. 木材材积表快速计算器_木材材积计算器
  6. GWAS中的名称概念
  7. SQL 2005镜像手册(不含见证服务器)
  8. 一元二次方程求根公式推导过程
  9. 48. 旋转图像 leetcode
  10. 华为超越三星排名企业第一!2021年欧洲专利局专利申请数量排行榜公布 | 美通社头条...