一、ListBase类
一)常用的属性
1、allowMultipleSelection:是否允许多项选择。默认为false。
2、dataProvider:数据提供者。
3、showDataTip:是否允许显示提示信息。
4、dataTipField:指明在数据中哪一部分,当鼠标停留在数据项上时,显示的提示信息。
5、dataTipFunction:指定的自定义方法返回显示的提示信息。
6、iconField:指定哪个数据字段值决定数据条目中的图标。
7、labelField:指定哪个数据字段作为控件中数据的标签。
8、labelFunction:自定义控件中数据标签的内容,而不用labelField中指定的值。
9、selectedIndex:选中条目的序号,没有选中任何条目时为-1。
10、selectedIndices:
11、selectedItem:选中条目的具体信息。
12、selectedItems:
13、variableRowHeight:是否允许每行的高度不同。
14、wordWrap:是否允许数据换行。
15、columnCount:表格的列数。
16、columnWidth:列宽。
17、rowCount:行数。
18、rowHeight:行高。
19、itemRenderer:条目渲染器,用于定制条目中显示的内容。
二)常用的事件
1、change:当selectedIndex、selectedItem属性值变化时触发。
2、itemClick:单击条目时触发。
3、itemDoubleClick:双击条目时触发。
4、itemRolOver:当鼠标停留在条目上时触发。
二、列表控件(List Control)的使用
一)常用的属性
1、editable:是否可编辑条目中的数据。默认为false。
2、showScrollTips:是否显示滚动条提示。
3、scrollTipFunction:定义显示滚动条提示的内容。
4、editedItemPosition:可编辑条目的起始位置。
二)常用的事件
1、itemEditBeginning:条目进入编辑状态时触发。
2、itemEditEnd:条目完成编辑时触发。
3、scroll:拖动滚动条时触发。
使用列表控制的步骤如下:
- 调用CreateWindowEx函数来创建一个列表控件,指定它的类名为SysListView32。您还可以在此处指定控件初次显示时的方式。
- 创建和初始化用在列表控件中显示项目的图象列表(如果存在)。
- 向列表控件中插入列,如果显示的方式是报告方式这一步是必须的。
- 向控件中插入项目和自项目。
所用到的两种数据结构:
列:
LV_COLUMN STRUCT
imask dd ?
fmt dd ?
lx dd ?
pszText dd ?
cchTextMax dd ?
iSubItem dd ?
iImage dd ?
iOrder dd ?
LV_COLUMN ENDS
Field name | Meanings |
---|---|
imask | 一组标志位标明该结构体中那些成员变量中的值有效。它的意义和上面我们提到的LV_COLUMN型结构体中向对应的成员变量基本相同。更详细的信息,可以查询WIN32 API 手册。 |
iItem | 该结构体代表的项目的索引号。索引号是从0开始编号的。该值和表单的“行”类似。 |
iSubItem | 和上一个成员变量指定的项目相连的子项目的索引号。您可以把它当作表单的“列”。譬如您想要把一个项目插入到新创建的列表视图控件,iItem的值应为0(因为该项目是第一个项目),iSubItem的值也应当为0(我们想把该项目插到第一列)。如果你想指定一个子项目和该项目相连,iItem中应该是您想要相连的项目的索引号,iSubItem的值应当是大于0的值,具体的值取决于您想把该子项目插在那一列。如果你的列表视图控件一共有4列的化,第一列包含了项目,其余3列是留给子项目的。如果您想把子项目插在第四列,应当指定该值为3。 |
state | 该成员变量包含的标志位反应了项目的状态。状态的改变可能是由用户的操作引起的或是程序改变的。这些状态包括:是否有焦点/高亮度显示/被选中(由于被剪切)/被选中等。另外还包括,以1为基数的索引用来代表是否处使用重叠/状态图标。 |
stateMask | 由于上面的成员变量包含状态标志位、重叠的位图索引号、和状态位图的索引号,我们需要告诉WINDOWS我们到底需要设定或查询那一个值。该成员变量就是用来做这项工作的。 |
pszText | 当我们想设定项目的属性时,它包含项目名称的ASCII码的字符串的地址。当查询项目的属性时,该成员变量将用来接收查询返回的项目的名称。 |
cchTextMax | 仅当您用来查询项目的属性时才需要使用该值,这时它包含上一个成员变量的大小。 |
iImage | 图标在列表视图中的图象链表中的索引号。 |
lParam | 用户定义的值,当您给项目排序时使用。当您告诉列表视图对项目排序时,列表视图将成对地比较项目。 它将会把两个项目的lParam的值传给您,这样您就可以进行比较先列出那一个了。如果您现在还不太明白的话,没有系,我们稍后还要讲关于排序的问题。 |
控件通过SendMessage来发送消息来控制,常用的消息有:
LVM_INSERTCOLUMN 加入列,wParam 为整型,指定列号,lParam 为指向LV_COLUMN结构的指针
LVM_SETCOLUMN 设置列,参数同上
LVM_INSERTITEM 加入项目或子项目,wParam 为0,lParam 为指向LV_ITEM结构的指针
LVM_SETITEM 设置项目或子项目,参数同上
LVM_GETITEM 取得项目或子项目,参数同上
LVM_GETNEXTITEM 取得下一个项目或子项目,可以用来取得光标选择的项目
LVM_DELETEITEM 删除项目或子项目,wParam 为整型,指定项目索引号,lParam 为0
LVM_DELETEALLITEMS 删除所有项目,wParam 和 lParam 均为0
LVM_SETTEXTCOLOR 设置文字颜色,wParam 为0,lParam 为颜色的RGB值
LVM_SETTEXTBKCOLOR 设置文字背景色,参数同上
LVM_SETBKCOLOR 设置背景色,参数同上
下面是用SysListView32控件实现的简单的学生管理系统程序的一部分:
void InsertColumn(void)
{
LV_COLUMN lvc;
lvc.mask = LVCF_TEXT | LVCF_WIDTH;
lvc.pszText = "学号";
lvc.cx = 60;
SendMessage(hList, LVM_INSERTCOLUMN, 0, (long)&lvc);
lvc.pszText = "姓名";
lvc.cx = 80;
SendMessage(hList, LVM_INSERTCOLUMN, 1, (long)&lvc);
lvc.pszText = "性别";
lvc.cx = 40;
SendMessage(hList, LVM_INSERTCOLUMN, 2, (long)&lvc);
lvc.pszText = "年龄";
lvc.cx = 40;
SendMessage(hList, LVM_INSERTCOLUMN, 3, (long)&lvc);
lvc.pszText = "出生日期";
lvc.cx = 100;
SendMessage(hList, LVM_INSERTCOLUMN, 4, (long)&lvc);
lvc.pszText = "籍贯";
lvc.cx = 150;
SendMessage(hList, LVM_INSERTCOLUMN, 5, (long)&lvc);
lvc.pszText = "入学时间";
lvc.cx = 100;
SendMessage(hList, LVM_INSERTCOLUMN, 6, (long)&lvc);
lvc.pszText = "数学";
lvc.cx = 40;
SendMessage(hList, LVM_INSERTCOLUMN, 7, (long)&lvc);
lvc.pszText = "英语";
lvc.cx = 40;
SendMessage(hList, LVM_INSERTCOLUMN, 8, (long)&lvc);
lvc.pszText = "政治";
lvc.cx = 40;
SendMessage(hList, LVM_INSERTCOLUMN, 9, (long)&lvc);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInst;
HMENU hMenu;
LV_ITEM lvi;
int i;
switch (message) {
case WM_CREATE:
hInst = ((LPCREATESTRUCT)lParam) -> hInstance;
hMenu = GetMenu(hwnd);
InitCommonControls();
hList = CreateWindowEx(NULL, TEXT("SysListView32"), NULL, LVS_REPORT | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, NULL, hInst, NULL);
InsertColumn();
SendMessage(hList, LVM_SETTEXTCOLOR, 0, RGB(255, 255, 255));
SendMessage(hList, LVM_SETBKCOLOR, 0, RGB(100, 100, 100));
SendMessage(hList, LVM_SETTEXTBKCOLOR, 0, RGB(0, 0, 0));
Refresh();
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDREFRESH:
Refresh();
break;
case IDINSERT:
if (DialogBox(hInst, TEXT("StudInfo"), hwnd, InsertDlgProc)) InvalidateRect(hwnd, NULL, TRUE);
break;
case IDEDIT:
lvi.iItem = SendMessage(hList, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
if (-1 == lvi.iItem) {
MessageBox(hwnd, "请选择一条记录!", "Edit Info", MB_OK | MB_ICONWARNING);
break;
}
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = 20;
for (i = 0; i < 10; ++i) {
lvi.iSubItem = i;
lvi.pszText = buf[i];
SendMessage(hList, LVM_GETITEM, 0, (long)&lvi);
}
if (DialogBox(hInst, TEXT("StudInfo"), hwnd, EditDlgProc)) InvalidateRect(hwnd, NULL, TRUE);
break;
case IDDELETE:
lvi.iItem = SendMessage(hList, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
if (-1 == lvi.iItem) {
MessageBox(hwnd, "请选择一条记录!", "Delete Info", MB_OK | MB_ICONWARNING);
break;
}
SendMessage(hList, LVM_DELETEITEM, lvi.iItem, 0);
lvi.mask = LVIF_TEXT;
lvi.iSubItem = 0;
lvi.pszText = buf[0];
lvi.cchTextMax = 20;
SendMessage(hList, LVM_GETITEM, 0, (long)&lvi);
sprintf(query, "DELETE FROM student WHERE id = %s", buf[0]);
ODBCConnect(hwnd);
ODBCQuery(query);
ODBCQueryEnd();
ODBCDisconnect(hwnd);
break;
case IDEXIT:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case IDABOUT:
MessageBox(hwnd, "Students Info Administration System Developed by anonymous", "About", MB_OK | MB_ICONINFORMATION);
}
break;
case WM_SIZE:
MoveWindow(hList, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
___________________________________________________________________________________________________________________
列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示.列表框具有边框,并且一般带有一个垂直滚动条.列表框分单选列表框和多重选择列表框两种.单选列表框一次只能选择一个列表项,而多重选择列表框可以进行多重选择.对于列表项的选择,应用程序用CreateWindowEx创建列表框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(style)。
常数 说明
LBS_DISABLENOSCROLL 固定显示垂直滚动条。未指定本项时,当列表未超出窗口,垂直滚动条自动隐藏。
LBS_EXTENDEDSEL 使用键盘“SHIFT”键或另指定键加鼠标进行多选。
LBS_HASSTRINGS 含有字符串的自绘式列表框.应用程序在自绘式列表框进行自绘时可以用LB_GETTEXT消息来取得列表项的文本。
LBS_MULTICOLUMN 多列列表框,带有水平滚动条。应用程序可以用 LB_SETCOLUMNWIDTH 消息来为列表框指定列数。
LBS_MULTIPLESEL 支持多重选择。列表项的选择状态随着用户对该项单击或双击鼠标而翻转。
LBS_NODATA 本项已不被支持。
LBS_NOINTEGRALHEIGHT 列表框的尺寸由应用程序而不是Windows指定.通常,Windows指定尺寸会使列表项的某些部分隐藏起来。
LBS_NOREDRAW 禁止刷新。当选择发生变化时防止列表框被更新,可发送WM_SETREDRAW来改变该风格。
LBS_NOSEL 禁止选择,列表项只能看,不能被选择。
LBS_NOTIFY 当用户单击或双击鼠标时通知父窗口。
LBS_OWNERDRAWFIXED 指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度。在控件被创建时父窗口将收到WM_MEASUREITEM 消息,当需要重绘时父窗口将收到 WM_DRAWITEM 消息。
LBS_OWNERDRAWVARIABLE 指定自绘式列表框,并且列表项有不同的高度.在控件被创建时父窗口将收到WM_MEASUREITEM消息,当需要重绘时父窗口将收到 WM_DRAWITEM 消息。
LBS_SORT 使插入列表框中的项按字母升序排列.
LBS_STANDARD 使用默认风格,相当于指定了边框,垂直滚动条,字母升序排列和鼠标单双击通知消息这几项风格
LBS_USETABSTOPS 使列表框在显示列表项时识别并扩展制表符(08h),缺省的制表宽度是32个对话框单位。
LBS_WANTKEYBOARDINPUT 响应键盘输入。当控件拥有键盘输入焦点时,允许接收父窗口接收WM_VKEYTOITEM和WM_CHARTOITEM消息,输入字符。
应用程序可以通过调用SendMessage向控件发送如下消息来设定和查询控件各种参数。
uMsg wParam lParam 说明
LB_ADDFILE 0 件名地址 增加文件名。
LB_ADDSTRING 0 符串地址 追加一个列表项。如果指定了LBS_SORT风格,表项将被重排序,否则将被追加在列表框的最后一项。
LB_DELETESTRING 列表项序号 0 删除指定的列表项,
LB_DIR DDL_ARCHIVE 指向通配符地址 在列表框中列出文件名,必须是当前路径内,符合指定通配符,存档属性的文件名。
LB_DIR DDL_DIRECTORY 指向通配符地址 在列表框中列出当前路径的子文件夹。子文件夹名前后将加上一对方括号"
- "
LB_DIR DDL_DRIVES 指向通配符地址 在列表框中列出本机的所有驱动器名。驱动器名前后将加上一对方括号和减号"[-*-]"
LB_DIR DDL_EXCLUSIVE 指向通配符地址 只列出指定属性的文件名,默认情况下是所有可读写文件都列出。如果没有指定任何文件属性,则不列出文件名。
LB_DIR DDL_HIDDEN 指向通配符地址 列出隐藏属性的文件名。
LB_DIR DDL_READONLY 指向通配符地址 列出只读属性的文件名。
LB_DIR DDL_READWRITE 指向通配符地址 列出读写属性的文件名。
LB_DIR DDL_SYSTEM 指向通配符地址 列出系统属性的文件名。
LB_FINDSTRING 开始表项序号 字符串地址 查找匹配字符串,忽略大小写,从指定开始表项序号开始查找,当查到某表项的文本字符串的前面包括指定的字符串则结束,找不到则转到列表框第一项继续查找,直到查完所有表项,如果wParam为-1则从列表框第一项开始查找,如果找到则返回表项序号,否则返回LB_ERR。如:表项字符串为"abc123"和指定字串"ABC"就算匹配。
LB_FINDSTRINGEXACT 开始表项序号 字符串地址 查找字符串,忽略大小写,与LB_FINDSTRING不同,本操作必须整个字符串相同。如果找到则返回表项序号,否则返回LB_ERR。
LB_GETANCHORINDEX 0 0 返回鼠标最后选中的项的索引
LB_GETCARETINDEX 0 0 返回具有矩形焦点的项的索引
LB_GETCOUNT 0 0 返回列表项的总项数,若出错则返回LB_ERR.
LB_GETCURSEL 0 0 本操作仅适用于单选择列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则返回LB_ERR.
LB_GETHORIZONTALEXTENT 0 0 返回列表框的可滚动的宽度(象素)
LB_GETITEMDATA 索引 0 每个列表项都有一个32位的附加数据.该函数返回指定列表项的附加数据。若出错则函数返回LB_ERR.
LB_GETITEMHEIGHT 索引 0 返回列表框中某一项的高度(单位:象素)
LB_GETITEMRECT 索引 RECT结构地址 获得列表项的客户区的RECT
LB_GETLOCALE 0 0 取列表项当前用于排序的语言代码,当用户使用LB_ADDSTRING向组合框中的列表框中添加记录并使用LBS_SORT风格进行重新排序时,必须使用该语言代码。返回值中高16位为国家代码。
LB_GETSEL 索引 0 返回指定列表项的状态。如果查询的列表项被选择了,函数返回一个正值,否则返回0,若出错则返回LB_ERR。
LB_GETSELCOUNT 0 0 本操作仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR.
LB_GETSELITEMS 数组的大小 缓冲区 本操作仅用于多重选择列表框,用来获得选中的项的数目及位置。参数lParam指向一个整型数数组缓冲区,用来存放选中的列表项的索引。wParam说明了数组缓冲区的大小。本操作返回放在缓冲区中的选择项的实际数目,若出错函数返回LB_ERR.
LB_GETTEXT 索引 缓冲区 用于获取指定列表项的字符串。参数lParam指向一个接收字符串的缓冲区.wParam则指定了接收字符串的列表项索引。返回获得的字符串的长度,若出错,则返回LB_ERR。
LB_GETTEXTLEN 索引 0 返回指定列表项的字符串的字节长度。wParam指定了列表项的索引.若出错则返回LB_ERR。
LB_GETTOPINDEX 0 0 返回列表框中第一个可见项的索引,若出错则返回LB_ERR.
LB_INITSTORAGE 表项数 内存字节数 本操作只适用于Windows95版本,当你将要向列表框中加入很多表项或有很大的表项时,本操作将预先分配一块内存,以免在今后的操作中一次一次地分配内存,从而加快程序运行速度。
LB_INSERTSTRING 索引 字符串地址 在列表框中的指定位置插入字符串。wParam指定了列表项的索引,如果为-1,则字符串将被添加到列表的末尾。lParam指向要插入的字符串。本操作返回实际的插入位置,若发生错误,会返回LB_ERR或LB_ERRSPACE。与LB_ADDSTRING不同,本操作不会导致LBS_SORT风格的列表框重新排序。建议不要在具有LBS_SORT风格的列表框中使用本操作,以免破坏列表项的次序。
LB_ITEMFROMPOINT 0 位置 获得与指定点最近的项的索引,lParam指定在列表框客户区,低16位为X坐标,高16位为Y坐标。
LB_RESETCONTENT 0 0 清除所有列表项。
LB_SELECTSTRING 开始表项序号 字符串地址 本操作仅适用于单选择列表框,设定与指定字符串相匹配的列表项为选中项。本操作会滚动列表框以使选择项可见。参数的意义及搜索的方法与LB_FINDSTRING类似。如果找到了匹配的项,返回该项的索引,如果没有匹配的项,返回LB_ERR并且当前的选中项不被改变。
LB_SELITEMRANGE TRUE或FALSE 范围 本操作仅用于多重选择列表框,用来使指定范围内的列表项选中或落选.参数lParam指定了列表项索引的范围,低16位为开始项高16位为结束项。如果参数wParam为TRUE,那么就选择这些列表项,否则就使它们落选。若出错函数返回LB_ERR。
LB_SELITEMRANGEEX 起点 终点 本操作仅用于多重选择列表框,若指定终点大于起点则设定该范围为选中,若指定起点大于终点则设定该范围为落选。
LB_SETANCHORINDEX 索引 0 设置鼠标最后选中的表项成指定表项
LB_SETCARETINDEX 索引 TRUE或FALSE 设置键盘输入焦点到指定表项,若lParam为TRUE则滚动到指定项部份可见,若lParam为FALSE则滚动到指定项全部可见。
LB_SETCOLUMNWIDTH 宽度(点) 0 设置列的宽度。
LB_SETCOUNT 项数 0 设置表项数目
LB_SETCURSEL 索引 0 本操作仅适用于单选择列表框,设置指定的列表项为当前选择项。本操作会滚动列表框以使选择项可见。参数wParam指定了列表项的索引,若为-1,那么将清除列表框中的选择。若出错函数返回LB_ERR。
LB_SETHORIZONTALEXTENT 宽度(点) 0 设置列表框的滚动宽度。
LB_SETITEMDATA 索引 数据值 更新指定列表项的32位附加数据。
LB_SETITEMHEIGHT 索引 高度(点) 指定列表项显示高度,带有LBS_OWNERDRAWVARIABLE(自绘列表项)风格的控件,只设置由wParam指定项的高度,其它风格将更新所有的列表项的高度。
LB_SETLOCALE 语言代码 0 取列表项当前用于排序的语言代码,当用户使用LB_ADDSTRING向组合框中的列表框中添加记录并使用LBS_SORT风格进行重新排序时,必须使用该语言代码。返回值中高16位为国家代码。
LB_SETSEL TRUE或FALSE 索引 本操作仅适用于多重选择列表框,它使指定的列表项选中或落选。参数lParam指定了列表项的索引,若为-1,则相当于指定了所有的项。参数wParam为TRUE时选中列表项,否则使之落选。若出错则返回LB_ERR。
LB_SETTABSTOPS 站数 索引顺序表 设置列表框的光标(输入焦点)站数及索引顺序表。
LB_SETTOPINDEX 索引 0 用来将指定的列表项设置为列表框的第一个可见项,该函数会将列表框滚动到合适的位置。wParam指定了列表项的索引.若操作成功,返回0值,否则返回LB_ERR。
当用户在列表框上进行各种操作时,其父窗口将收到WM_COMMAND通知消息,同时wParam的低16位带控件的ID。lParam带控件句柄(hWnd),wParam的高16位带有如下表的消息代码。
消息代码 说明
LBN_DBLCLK 用户单击了列表项。
LBN_ERRSPACE 列表框无法申请到足够的内存空间。
LBN_KILLFOCUS 列表框失去输入焦点。
LBN_SELCANCEL 取消选择列表项。
LBN_SELCHANGE 列表框的选择项即将被改变。
LBN_SETFOCUS 列表框得到键盘输入焦点。__________________________________________________________________________________________________________________________
(1)添加项:
如果采用LBS_SORT样式,那么填入清单方块最简单的方法是借助LB_ADDSTRING消息:
SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) szString) ;
如果没有采用LBS_SORT,那么可以使用LB_INSERTSTRING指定一个索引值,将字符串插入到清单方块中:
SendMessage (hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString) ;
示例代码:
SendMessage(hwndLB,LB_INSERTSTRING,0,(LPARAM)TEXT("你好"));
(2)删除项:
在指定索引值的同时使用LB_DELETESTRING参数,这就可以从清单方块中删除字符串:
SendMessage (hwndList, LB_DELETESTRING, iIndex, 0) ;
(3)取得有多少项:
iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0) ;(4)选定某一项SendMessage (hwndList, LB_SETCURSEL, iIndex, 0) ;将iParam设定为-1则取消所有选择(5) 确定目前选项的索引:iIndex = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;如果没有项目被选中,那么从呼叫中传回的iIndex值为LB_ERR。(6)将某项目复制到文字缓冲区中:iLength = SendMessage (
hwndList, LB_GETTEXT, iIndex,
(LPARAM) szBuffer) ;确定清单方块中字符串的长度:iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) ;对以NULL字符终结的字符串长度来说,szBuffer数组必须够大。您也许想用LB_GETTEXTLEN先分配一些局部内存来存放字符串。