VS之listview使用
本文简单地介绍下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使用相关推荐
- Android ListView 点击item改变item的背景颜色(ListView实现光标移动)
一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector 用户指定当前选中item 的颜色 ...
- Android ListView 删除 item
实现效果 主要使用方法 是, remove 之后在刷新界面 adapter 里面的代码 public class MyAdapter extends BaseAdapter {private List ...
- ListView 添加头部 和尾部 布局 (addHeaderView 和 addFooterView)
ListView 添加头部 和尾部 布局 其实很简单 ,listview 暴露的有方法addHeaderView 和 addFooterView 从源码里面可以看到, addHeaderView 和 ...
- Android ListView item设置分割线以及分割线宽度
ListView item设置分割线的方法:setDivider ListView item设置分割线宽度的方法:setDividerHeight // 设置分割线 listView.setDivid ...
- Android ListView (多个adapter 说明)
最近维护项目,项目里面使用的都是ListView 这里也对ListView 回顾一下 以下 demo 地址 ListView 在Android 里面用来实现列表的, 在xml 中创建ListView ...
- 玩转android自定义控件二——自定义索引栏listview
带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...
- ListView style
步骤一:在使用的ListView的activiey里使用android:theme="@style/Theme的名字" 步骤二:创建Themes.xml 在Themes.xml里定 ...
- Android自定义ListView的Item无法响应OnItemClick的解决办法
转: 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就 ...
- 【原创】ListView快速滚动至新添加一行(自动滚动)
在C#开发中我们经常要开发一些日志系统,尤其是基于ListView的日志显示系统. 但是当日志增多是你是否有一些困扰,就是它为什么不会自动滚动至最后一行. 以下是一小段代码,希望可以帮助你. publ ...
- Android使用ListView控件问题
Android使用ListView控件问题: The application has stopped unexpectedly, please try again. 开发环境:android 1.6 ...
最新文章
- 联泰集群发布水晶系列工作站,用于深度学习场景
- 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建...
- hdu5014 构造b数列使得t最大(小想法)
- 构建Android的交叉编译器、用NDK编译移植
- python while循环true_Python while循环,pause while not,true时继续?
- Visual Studio 2012资源管理器里单击打开改为双击打开文件
- Android 系统(219)---Android O上networkAttributes的说明
- 华为综合测评是什么_喝水不用等待,温度随心控随时喝到热水,测评华为智选恒温电水壶...
- mysql怎么添加默认约束_分享知识-快乐自己:MySQL中的约束,添加约束,删除约束,以及一些其他修饰...
- LeetCode(8):字符串转整数(atoi)
- Android AlertDialog创建过程详解
- 还原二叉树--根据后序中序输出先序
- devtmpfs文件系统创建设备节点
- 无线AP与无线路由器都有些什么区别?(二)
- 求 逆矩阵 公式推导
- Java学习day07-认识类和对象(单元测试Test)
- Scala安装教程(最详细教程)
- Thinkphp使用CKEditor4富文本编辑器
- sqlite数据库的版本更替
- Reporting verbs
热门文章
- gpib-usb-hs linux,GPIB-USB-HS GPIB适配器
- 新东方副总裁徐健:人工智能时代如何实现教育升级?
- html的div插入图片,html插入图片示例(html添加图片)
- C#平均值计算器具体实现
- 木材材积表快速计算器_木材材积计算器
- GWAS中的名称概念
- SQL 2005镜像手册(不含见证服务器)
- 一元二次方程求根公式推导过程
- 48. 旋转图像 leetcode
- 华为超越三星排名企业第一!2021年欧洲专利局专利申请数量排行榜公布 | 美通社头条...