win32 sdk列表视图控件(ListCtrl或ListView)资料整理
列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来。与树视图类似,列表控件可以由多个子项目组成,可以设置为Icon(大图标)、SmallIcon(小图标)、List(列表)或Report(报表)。
一、列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM。LVCOLUMN用于定义报表方式下的“列”的结构;LVITEM用于定义“项”的结构。这两个结构的定义及说明如下:
typedef struct _LVCOLUMN {
UINT mask; 说明此结构中哪些成员是有效的
int fmt; 列的对齐方式
int cx; 列的初始宽度
LPTSTR pszText; 列的标题
int cchTextMax; pszText所指向的缓冲区的大小
int iSubItem; 与列关联的子项的索引值,从0开始
int iImage; 与列关联的图像列表中指定图像的索引值
int iOrder; 第几列,0代表最左一列
} LVCOLUMN, FAR LPLVCOLUMN;
-----------------------------------
typedef struct _LVITEM {
UINT mask; 说明LVITEM结构中哪些成员有效
int iItem; 项目的索引值(可以视为行号)从0开始
int iSubItem; 子项的索引值(可以视为列号)从0开始
UINT state; 子项的状态
UINT stateMask; 状态有效的屏蔽位
LPTSTR pszText; 主项或子项的名称
int cchTextMax; pszText所指向的缓冲区大小
int iImage; 关联图像列表中指定图像的索引值
LPARAM lParam; 程序定义的32位参数
int iIndent; 表示图像位置缩进的单位
} LVITEM, FAR LPLVITEM;
---------------------------------------
二、相关操作。因为是SDK编程,所以对控件的操作是向控件发送SendMessage()来实现的
LISTVIEW中的相关消息为:
1、LVM_SETTEXTCOLOR 和 LVM_SETTEXTBKCOLOR和 LVM_SETBKCOLOR //消息设定文本的前景和背景色,wParam 为0,lParam 为颜色的RGB值
2、 LVM_GETNEXTITEM //找到选中的行,对应ListView_GetNextItem宏将SendMessage打包为函数方式操作。
3、LVM_SETCOLUMNWIDTH //设置列宽,对应ListView_SetColumnWidth
4、LVM_SETEXTENDEDLISTVIEWSTYLE //设置扩展风格如:LVS_EX_FULLROWSELECT(选中一整行), LVS_EX_GRIDLINES(网络线),LVS_EX_CHECKBOXES(选择按钮),对应ListView_SetExtendedListViewStyle
5、LVM_INSERTCOLUMN //插入新列,对应ListView_InsertColumn,wParam 为整型,指定列号,lParam 为指向LV_COLUMN结构的指针
6、LVM_SETCOLUMN //设置列,参数同上
7、LVM_INSERTITEM //插入项目(行),对应ListView_InsertItem,加入项目或子项目,wParam 为0,lParam 为指向LV_ITEM结构的指针
8、LVM_SETITEM //设置子项(行中的每列),对应ListView_SetItem,设置项目或子项目,参数同上
9、LVM_GETITEM //取得项目或子项目,参数同上
10、LVM_GETITEMCOUNT //获取项数,对应ListView_GetItemCount
11、LVM_GETNEXTITEM 取得下一个项目或子项目,可以用来取得光标选择的项目
12、LVM_DELETEITEM //删除项,对应ListView_DeleteItem,删除项目或子项目,wParam 为整型,指定项目索引号,lParam 为0
13、LVM_DELETEALLITEMS //删除所有项目,wParam 和 lParam 均为0
三、ListCtrl控件的扩展样式
LVS_EX_GRIDLINES //绘制表格线
LVS_EX_SUBITEMIMAGES//子项目图标列表
LVS_EX_CHECKBOXES //带复选框
LVS_EX_TRACKSELECT //自动换行
LVS_EX_HEADERDRAGDROP//报表头可以拖拽
LVS_EX_FULLROWSELECT //选择整行
LVS_EX_ONECLICKACTIVATE//单击激活
LVS_EX_TWOCLICKACTIVATE//双击激活
LVS_EX_FLATSB//扁平滚动条
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作区
四、ListView控件属于通用控件CONTROL中的一种,在SDK编程方式时要使用通用控件
必须包含comctl32.dll,所以代码中要有头文件: commctrl.h 导入库:comctl32.lib
在使用通用控件之前应该先调用InitCommonControls();初始化它
以ListView控件为例:
InitCommonControls();
//子窗口形式使用LISTVIEW
CreateWindowEx(0, //扩展风格 WC_LISTVIEW, //这是系统定义的宏,WC_LISTVIEW对应 "SysListView32" "123", //窗口标题 WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SINGLESEL , //窗口风格 (普通控件风格在这里设置,扩展风格要单独设置) 0, 0, //窗口大小 420, //宽度一定要等于所有列宽的和,否则会看起来有空列 600, hwnd, //父窗口句柄 NULL, //菜单句柄 hInstance, //实例句柄 NULL //创建参数 );
//也可以在对话框资源文件中以子控件的方式使用
CONTROL "",IDC_LISTVIEW, "SysListView32", WS_BORDER | WS_TABSTOP | LVS_REPORT | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SINGLESEL, 7,110,300,133
五、部分操作代码。
void in_it(HWND hwnd,int iSubItem,int cx,char *text,int cchTextMax,int len)//插入列函数
{
LVCOLUMN ColInfo1 = {0};//LVCOLUMN 定义一个结构变量ColInfo1)
ColInfo1.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo1.iSubItem = iSubItem;
ColInfo1.fmt = LVCFMT_CENTER;
ColInfo1.cx = cx;
ColInfo1.pszText=(LPWSTR)text;
ColInfo1.cchTextMax = cchTextMax;
SendMessage(hwnd, LVM_INSERTCOLUMN, WPARAM(len), LPARAM(&ColInfo1));
};
void set_data(HWND hwnd,char *text,int x,int y)
{
LVITEM item;
item.mask=LVIF_TEXT;
item.pszText=text;
item.iItem=x;
item.iSubItem=y;
if(y==0)
SendMessage(hwnd, LVM_INSERTITEM, 0, LPARAM(&item));
else
SendMessage(hwnd, LVM_SETITEM, 0, LPARAM(&item));
}
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
HWND hWndlist= GetDlgItem(hwnd, IDC_LIST1);
SendMessage(hWndlist, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES);
in_it(hWndlist,0,115,"商品名称",50,0);
in_it(hWndlist,0,115,"编号",50,1);
in_it(hWndlist,0,115,"价格",50,2);
set_data(hWndlist,"电冰箱",0,0);
set_data(hWndlist,"电视机",1,0);
set_data(hWndlist,"笔记本",2,0);
set_data(hWndlist,"吸尘器",3,0);
set_data(hWndlist,"1234",0,1);
set_data(hWndlist,"3000",0,2);
set_data(hWndlist,"2345",1,1);
set_data(hWndlist,"5000",1,2);
set_data(hWndlist,"3456",2,1);
set_data(hWndlist,"4000",2,2);
set_data(hWndlist,"4567",3,1);
set_data(hWndlist,"3500",3,2);
return TRUE;
}
win32 sdk列表视图控件(ListCtrl或ListView)资料整理的更多相关文章
- win32 sdk 列表视图控件绘制
////////////////////////////////////////////////////////////// LRESULT ListViewCustomDraw(HWND hwnd, ...
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...
- VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见, ...
- MFC编程入门之二十八(常用控件:列表视图控件List Control上)
前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...
- MFC常用控件之列表视图控件(List Control)
近期学习了鸡啄米大神的博客,对其中的一些知识点做了一些自己的总结.不过,博客内容大部分来自鸡啄米.因此,这个博客算是转载博客,只是加了一些我自己的理解而已.若想学习鸡啄米大神的博客总结,请点击连接:h ...
- (七)对话框,单选框(radiobox),复选框(checkbox),列表框(ListBox),组合框(CComboBox),水平滚动条(Horizontal scroll bar),微调(旋转)spincontrol,列表视图控件CListCtrl,静态控件static
1,模态对话框和非模态对话框 // 模态对话框 void CMainFrame::OnDialogExec() { // TODO: 在此添加命令处理程序代码 // 创建对话框对象 CDialog d ...
- VS2010-MFC(常用控件:列表视图控件List Control 下)
转自:http://www.jizhuomi.com/software/197.html 上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构 ...
- VS2010-MFC(常用控件:列表视图控件List Control 上)
转自:http://www.jizhuomi.com/software/195.html 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方 ...
- Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)
Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果] [功能] 下拉刷新 ...
随机推荐
- python 注册表重置ie代理 ss使用后的代理恢复
每次用完ss客户端,浏览器代理都不会改回来,不想手动改,只能用python脚本处理了. import winreg def disableProxy(): proxy = "" x ...
- 【积累】LinqToSql复合查询结果转DataTable数据
最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上. 为了方便,我们把它转换成DataTable的数据源形式.请看下面的示例: 1)思考自己需要的数据,然后组合,因此创建一个新的类: // ...
- linux 进程间通信之pipe
在实际开发过程中,程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标. 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内 ...
- java线程(5)——线程池(上)
引入: 在之前的例子中,我们需要使用线程时就直接去创建一个线程,这样既不浪费资源又十分方便.但如果我们需要创建多个并发的线程,而且短时间执行就结束了,如果还用之前的方式,就会大大降低效率和性能了. 因 ...
- BZOJ4475 JSOI2015子集选取(动态规划)
数据范围过大说明这个题和组合一点关系也没有,答案基本上肯定是ab的形式了.暴力打表感觉不太好写,找到当年的题面发现还有个样例是6 40 401898087,于是暴力找ab=401898087的数,发现 ...
- ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
A.Arcade Game(康拓展开) 题意: 给出一个每个数位都不同的数n,进行一场游戏.每次游戏将n个数的每个数位重组.如果重组后的数比原来的数大则继续游戏,否则算输.如果重组后的数是最大的数则算 ...
- axios超时重发
axios的超时是在response中处理的,所以要在response中添加拦截器: axios.interceptors.response.use(undefined, function axios ...
- Substrings Sort string 基本操作
You are given nn strings. Each string consists of lowercase English letters. Rearrange (reorder) the ...
- bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
[Lydsy1705月赛]排名的战争 Time Limit: 8 Sec Memory Limit: 256 MBSubmit: 338 Solved: 69[Submit][Status][Di ...
- Java类的声明和访问介绍
1.类的声明 类本身的声明:对类的声明来说,主要包括类的访问权限声明和非访问修饰符的使用.对于一个普通的Java类(POJO)来说,主要的访问权限修饰符只有两个public和默认权限,内部类可以有pr ...