ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,ListBox自然也不例外,ListBox中有它独有的消息,通知消息,风格,查看MSDN可以看到风格主要有:
风格
有两种类型的列表框:单项选择(默认)和多选择。 在一个单项选择列表框,用户可以选择只一次一个项目。 在多选列表框,用户可以选择多个项目在同一时间。要创建一个多选列表框中,指定LBS_MULTIPLESEL或LBS_EXTENDEDSEL风格。
列表框的样式和风格,控制窗口的外观和一个列表框的操作。这些样式列表框项目说明是否进行排序,多列排列,绘制应用程序,等等。尺寸和一个列表框样式通常定义在一个对话框,在应用程序的资源包含的模板。
对于一个列表框的样式表,请参见
列表框样式: 【LBS_COMBOBOX】 通知列表框,它是一个组合框的一部分。 //看来还要回过头去学下组合框的内容
【LBS_DISABLENOSCROLL】 显示被禁用的垂直滚动列表框时,框不包含足够的项目滚动条。如果不指定这个样式,滚动栏隐藏时,列表框不包含足够的项目。
【LBS_EXTENDEDSEL】 允许选择多个项目使用SHIFT键和鼠标或特殊键组合。 //可以使用组合键来选择
【LBS_HASSTRINGS】 指定列表框包含项目字符串组成。列表框保持为字符串,以便应用程序可以使用LB_GETTEXT信息检索特定项目的文本存储和地址。默认情况下,除所有者描述的列表框的列表框有这种风格。您可以创建带或不带这种风格的所有者描述的列表框。 //有字符串显示
【LBS_MULTICOLUMN】 指定amulti columnn列表框水平滚动。该LB_SETCOLUMNWIDTH消息设置列的宽度。
//设置多列显示的样式
【LBS_MULTIPLESEL】 打开或关闭用户每次点击或双击列表中的一个选择框中的字符串的字符串。用户可以选择任何字符串的数量。 //设置可以选择多行的功能。
【LBS_NODATA】 指定无数据列表框。当指定此风格中的项目列表框数将超过一千。无数据列表框中还必须有LBS_OWNERDRAWFIXED风格,但绝不能有LBS_SORT或LBS_HASSTRINGS风格。 无数据列表框类似于一个所有者描述的列表框,除了它包含一个项目没有字符串或位图数据。命令添加,插入或删除一个项目总忽略任何指定的项目资料;要求找到一个在列表框中的字符串总是失败。该系统将发送WM_DRAWITEM消息给所有者窗口时,必须制定一个项目。在与WM_DRAWITEM消息通过DRAWITEMSTRUCT结构itemid的成员指定行号的项目要绘制。无数据列表框不寄WM_DELETEITEM消息。 //这么说,这个风格只是显示用的,就当作是PAINT函数中的画板,不保存任何数据。
【LBS_NOINTEGRALHEIGHT】 指定列表框的大小是完全由应用程序时创建的列表框中指定的大小。通常,系统尺寸的列表框,以便列表框不显示部分项目。 //使用默认的项目高度
【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 启用一个列表框承认并扩大其在制定制表符的字符串。您可以使用LB_SETTABSTOPS消息指定制表位位置。默认的制表符位置是32对话框模板单位分开。对话框模板单位是独立于设备的对话框中使用的模板单位。转换到屏幕上对话框模板单位单位(像素)的测量,使用MapDialogRect功能。 //使用TAB键来定位
【LBS_WANTKEYBOARDINPUT】 指定该列表框的所有者获得WM_VKEYTOITEM消息当用户按下一个键,列表框具有输入焦点。这使应用程序能够在键盘上输入执行特殊处理。
//可以处理按键消息的风格
列表框的行为
一般父窗口通过向列表框发送消息来控制列表框的行为,而发送的消息一般有以下几种: LB_ADDFILE 添加文件 LB_ADDSTRING 添加字符串 LB_DELETESTRING 删除字符串 LB_DIR 添加文件名列表 LB_FINDSTRING 返回列表框中的一个字符的索引 LB_FINDSTRINGEXACT 在列表框查找第一个与特定字符匹配的字符并返回它的索引 LB_GETANCHORINDEX 获取锚点的索引,锚点就是在多选模式下选中的第一项 LB_GETCARETINDEX 在多选模式下返回具有焦点条目的索引 LB_GETCOUNT 获取列表框中子项的总数 LB_GETCURSEL 获取被选中的子项的索引,只在单选模式下有效 LB_GETHORIZONTALEXTENT 获取水平滚动条的宽度 LB_GETITEMDATA 获取与指定列表项相关的程序的自定义值(长度为32位) LB_GETITEMHEIGHT 获取列表项的高 LB_GETITEMRECT 获取列表项边界矩形的大小 LB_GETLOCALE 获得当前列表的区域,可以通过该区域决定正确的排序规则或者显示排序后的文本 LB_GETSEL 获得列表项的选择状态,被选中时大于0,未被选中时为0,发生错误时小于0 LB_GETSELCOUNT 在多选模式下获取当前被选中的项总数 LB_GETSELITEMS 在多选模式下,获取选项的值,需要提供一个相应的数组的首地址用来保存返回结果 LB_GETTEXT 获取指定项的字符串 LB_GETTEXTLEN 获得指定项字符串的长度 LB_GETTOPINDEX 获取列表框中显示的第一列的索引,当使用滚动条使显示内容发生变化时,这个索引也会发生改变 LB_INITSTORAGE 需要加入大量列表项时使用 LB_INSERTSTRING 添加列表项,但是与LB_ADDSTRING不同的是,加入后新字符串不参加排序 LB_RESETCONTENT 清除所有列表项 LB_SELECTSTRING 从指定位置向后查找我们指定的字符串项,找到后将该项设置为选中状态 LB_SELITEMRANGE 在多选模式下,将某一区域内一个或多个项设置为选中状态 LB_SETCARETINDEX 在多选模式下,设置给定索引值的矩形设置为焦点矩形,如果该值没有显示,那么滚动条将会自动滚动到相应行 LB_SETCOLUMNWIDTH 在多列模式下设置所有项的的列宽,使用这个消息必须保证列表框有LBS_MULTICOLUMN风给 LB_SETCOUNT 设置列表项的总数,用于具有LBS_NODATA风给但是不具有LBS_HASSTRINGS风格的列表框 LB_SETCURSEL 设置某项处于被选中状态,并将该项加亮显示 LB_SETHORIZONTALEXTENT 设置水平滚动条的宽度,当列表框的宽度不足以显示所有项的时候,滚动条出现,否则隐藏 LB_SETITEMDATA 设置特定项的值 LB_SETITEMHEIGHT 设置列表项的宽。 LB_SETLOCALE 设置列表框的当前区域 LB_SETSEL 在多选模式下选中某一字符串 LB_SETTABSTOPS 设置TAB键停止的位置 LB_SETTOPINDEX 设置列表框中的某一项处于可见位置
列表框向其父窗口发送的通知码
列表框向其父窗口发送的通知码为: LBN_DBLCLK 当某一项被单击时发送 LBN_ERRSPACE 当系统不能分配足够的内存来进项相应的处理时发送该通知码 LBN_KILLFOCUS 当列表框中某一项失去焦点时发送 LBN_SELCANCEL当用户取消选择时发送 LBN_SELCHANGE 当用户选择改变时发送 LBN_SETFOCUS 当某一项获得焦点时发送
发送消息到列表框
一个对话框程序可以将消息发送到一个列表框添加,删除,检查和更改列表框中的项目。 例如,一个对话框程序可以发送消息到一个LB_ADDSTRING列表框中添加一个项目,一个LB_GETSEL消息,以确定该项目是否被选中。其他消息设置和检索信息的大小,外观和列表框的行为。例如,LB_SETHORIZONTALEXTENT消息设置一个列表框滚动宽度。一个对话框程序可以发送任何信息到一个列表框使用SendMessage或SendDlgItemMessage功能
。
一个列表框项是经常引用其索引,一个整数,表示该项目在列表框的位置。作者在一个列表框中的第一项指数为0,第二项指标是1,依此类推。
以下消息处理由默认窗口进程处理为预定义列表框窗口类窗口程序执行的所有邮件的列表框不进程的默认处理。当列表框过程返回一个消息假,预定义的窗口过程检查邮件,并执行默认操作,如下表所示。
消息默认操作WM_CHAR消息移动到第一个项目,与用户键入的字符开始的选择。如果列表框具有LBS_OWNERDRAW风格,没有动作发生。在很短的时间间隔输入多个字符都被视为一组,第一个项目,有了一系列字符开始被选中。
WM_CREATE 创建一个空的列表框。
WM_DESTROY 销毁列表框和释放任何资源的用途。 传递到对话框的父窗口的程序或进程的信息。
WM_ENABLE 如果控制是可见的,无效的字符串,以便可以涂灰色的矩形。
WM_ERASEBKGND 消息擦除一个列表框的背景。如果列表框具有LBS_OWNERDRAW风格,背景也不会消失。
WM_GETDLGCODE 返回DLGC_WANTARROWS | DLGC_WANTCHARS,表示默认的过程处理列表框上的箭头键和WM_CHAR消息。
WM_GETFONT 返回的句柄为列表框中的当前字体。
WM_HSCROLL 滚动列表框水平。
WM_KEYDOWN 消息流程,滚动虚拟键。虚拟关键是这个项目的移动插入符号索引。选拔是没有改变。 WM_KILLFOCUS
打开关闭和破坏它插入符号。通知消息发送LBN_KILLFOCUS到列表框的所有者。 WM_LBUTTONDBLCLK
清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。
WM_LBUTTONDOWN
曲目清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。
WM_LBUTTONUP 曲目清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。
WM_MOUSEMOVE 消息曲目清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。 执行通过使用列表框的句柄设备上下文(DC)的子类的绘制操作。
WM_SETFOCUS 打开的插入符号并发送一个通知消息LBN_SETFOCUS到列表框的所有者。
WM_SETFONT 设置一个列表框的新字体。
WM_SETREDRAW 设置或清除重绘标志的基础上,wParam的值。 的WM_SIZE调整为列表框的项目的整数倍。
WM_VSCROLL 垂直滚动列表框。
程序实例
建立一个listbox,然后点击列表选择目标,弹出提示框显示选中项
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static HWND hList;
static HFONT hFont;
static HWND hBtn;
static HWND hStatic;
static TCHAR szBuffer[128];
static HWND hListBox;
static int value;
int iIndex, iLength;
TCHAR * pVarName;
switch (message)
{
case WM_CREATE:
hListBox = CreateWindow(TEXT("LISTBOX"), TEXT("我是个BOX"),
hListBox = CreateWindow(TEXT("LISTBOX"), TEXT("我是个BOX"),
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_HASSTRINGS| LBS_NOTIFY,
10, 10, 200, 150,
hWnd, (HMENU)30,
hInst, NULL);
ShowWindow(hListBox,SW_SHOW);
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("你好"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("我好"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("他好"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("都不好"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("狗好"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("猫好"));
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("兔子好"));
hFont = CreateFont(
-18, -9, 0, 0, 400 ,
FALSE, FALSE, FALSE,
DEFAULT_CHARSET,
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY,
FF_DONTCARE,
TEXT("微软雅黑")
);
SendMessage(hListBox, WM_SETFONT, (WPARAM)hFont, 0);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId) {
case 30:
if (wmEvent == LBN_SELCHANGE)
{
iIndex = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
iLength = SendMessage(hListBox, LB_GETTEXTLEN, iIndex, 0) + 1;
pVarName = calloc(iLength, sizeof(TCHAR));
SendMessage(hListBox, LB_GETTEXT, iIndex, (LPARAM)pVarName);
MessageBox(hWnd, pVarName, TEXT("提示信息"), MB_ICONINFORMATION);
free(pVarName);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
DeleteObject(hFont);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
点击对应项,弹出提示框
|